2016-08-08 51 views
2

Ich versuche, ein Menü mit einer while Schleife zu erstellen. Ich möchte, dass das Menü ausgeführt wird, bis der Benutzer "n" oder "N" drückt.While-Schleife beendet nicht, wenn Benutzer "n" drückt

$MenuChoice 

while ($MenuChoice -ne "n" -or $MenuChoice -ne "N") { 
    Write-Host "Run again? y/n " 
    Read-Host $MenuChoice 
} 

Das Problem ist, dass, es läuft, ob I "N" oder "Y" drücken.

Muss ich einen Wert für $MenuChoice deklarieren?

Antwort

2

Sie müssen die Ausgabe von Read-Host-$MenuChoice zuzuweisen:

# Initial value (in case this is run more than once) 
$MenuChoice = $null 
# This comparison is not case-sensitive 
while ($MenuChoice -ne 'n') { $MenuChoice = Read-Host 'Run again? [y/n]' } 
+0

Danke, was macht der $ null? Es sagt Powershell, dass es noch keinen Wert hat? –

+0

@TonyAntony initialisiert die Variable, so dass sie existiert. Versuchen Sie 'Get-Variable TestVar', es wird ein Fehler zurückgegeben. Dann tue '$ TestVar = $ null' und versuche es erneut. Du wirst den Unterschied sehen. – briantist

+0

@TonyAntony eine Alternative wäre 'Remove-Variable MenuChoice'. Es stellt sicher, dass in der Variablen kein Wert vorhanden ist, der die Schleifenaustrittsbedingung vorzeitig auslösen könnte. Sie können dies vermeiden, indem Sie die von briantist vorgeschlagene do-Schleife verwenden. –

0

Eine weitere Alternative, auf Chris Dent's answer bauen, verwenden Sie eine do {} while() Schleife:

do { 
    $MenuChoice = Read-Host 'Run again? [y/n]' 
} while ($MenuChoice -ine 'n') 

(auch -ine mit der zu Formulieren case insensitive comparison, obwohl -ne standardmäßig die Groß- und Kleinschreibung nicht berücksichtigt)