Powershell If NOT Int abfrage?
Wie schreibe ich eine IF abfrage, die aussagt: Wenn die Eingabe KEIN Integar ist, gebe eine fehlermeldung raus und wiederhole den Vorgang ?
Danke für die Hilfe :)
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
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'}
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
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)