Powershell If NOT Int abfrage?

2 Antworten

If ($DeineVariable.GetType() -notlike "int*")
{
Write-Warning "blabla"
Continue
}

Notlike weil es mehrere Integer-Typen gibt (int32, int64).

Du kannst auch statt Write-Warning "Write-Error" nehmen

Woher ich das weiß:Berufserfahrung – arbeite seit vielen Jahren in der IT

ganz simpel:

$test=1
if (!($test -is [int])){'kein Interger'} else {'Integer'}
$test='blub'
if (!($test -is [int])){'kein Interger'} else {'Integer'}
$test=.1
 if (!($test -is [int])){'kein Interger'} else {'Integer'}
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Lukmon22 
Beitragsersteller
 11.04.2022, 10:25

Ich habe einen Taschenrechner programmiert und möchte dass er in der Variabel $Zahl1 nur Zahlen eintippen kann.

$Zahl1 = $(Write-Host ‚Bitte geben sie die erste Zahl ein‘ -Foregroundcolour Gray -nonewline; Read-Host)

(Damit ich den Text farbig haben kann trotz read-Host)

0
Erzesel  11.04.2022, 16:53
@Lukmon22

Bei Read-Host kannst Du nur im Nachhinein testen ob eine Eingabe eine Zahl ist, da diese erst nach dem {Enter} zur Verfügung steht. Read-Host darfst Du Dir nicht als irgendeinen billigen Befehl vorstellen . Es ist ein kompletter kleiner Editor, welcher auch Löschen von Zeichen , Änderungen der Cursorposition, Entfernen und Einfügen beherrscht!

Im folgenden Beispiel erzwinge ich (wenn Möglich) die Umwandlung der Eingabe in einen Numerischen Wert .

Write-Host 'Gib  eien Zahl ein :' -NoNewLine
do {
    $MyNum=(Read-Host) -as [double]  #erzwinge die Umwandlung der Eingabe zu einer Zahl, [double] deckt weitgehen alle Zahlen ab
    if ($Null -eq $MyNum){
        Write-Host 'Ich will eine Zahl :' -n -fo red
    }
} while ($Null -eq $MyNum) #kann die  Eingabe  nicht in eine Zahl  umgewandelt  werden drehe  eine weitere Runde
'Du hast {0} eingegeben' -f $myNum
pause

Soll schon bei der Eingabe ausgesiebt werden, muss man sich eben eine entsprechende InputMethode selber bauen ., welche bereits während der Eingabe jedes Zeichen auf Legitimität überprüft.

Die folgende Methode Read-Number funktioniert nicht in Powershell ISE ,da diese über keine Console verfügt, von welcher [Console]::ReadKey seinen Input bezieht!

Diese Methode besitzt auch nicht die Möglichkeiten wie Cursornavigation oder das Löschen von Zeichen. sie reagiert nur auf Ziffern, Punkt und Minus.

Eingaben nach folgendem Mustern sind möglich:

  • -2
  • 2
  • -.001
  • .001
  • -22.000
  • 3.14

Das soll nur zeigen in welche Richtung die Sache geht. Wenn Du die ganze Funktionalität eines ZeilenEditors wünscht, musst Du Code schreiben welcher Tasten wie Links,Rechts,Pos1,EndBackspace, Del und Ins behandelt. (dann hast Du aber auch relativ schnell ein 200Zeilen-Monster🥵🤮)

function Read-Number{
    $tempNum=''
    $result=''
    do{
        if ([Console]::KeyAvailable){
             # lies Tastendruck von der  Console
            $keyInfo = [Console]::ReadKey($true)
            $tempNum+=$keyInfo.KeyChar
             #ist die bisher gespeichete Zeichnkette eine mögliche Zahl?  positiv,negativ und/oder mit Fließpunkt?
            if ($tempNum -match '^-?\d*\.?$|^-?\d*\.*\d+$'){ 
                Write-Host $keyInfo.KeyChar -n
                $result=$tempNum
            }
            else {$tempNum=$result} #wenn die RegEx nicht passt, letzten Keychar verwerfen
        }
         #kleine Pause, sonst beanspruchen sinnlose Loops die CPU
        Start-Sleep -MilliSeconds 20
    } while ($keyInfo.Key -ne 'Enter')
    
    Write-Host  #erst jetzt neue Zeile
    #übergib eine Zahl
    if ( ([string]$result).endsWith('.') ){[double]0} #wenn nach dem Dezimalpunkt nix mehr kommt, gib einfach 0 zurück
    else{[double]$result}
}

 #mach was mit der neuen Funktion
Write-Host 'Input 1.Number:' -n
$MyNum1= Read-Number
Write-Host 'Input 2.Number:' -n
$MyNum2= Read-Number
Write-Host ('{0} * {1} = {2}' -f $MyNum1,$MyNum2, ($MyNum1*$MyNum2))
pause



0