Das PowerShell-Skript wird nach der Ausführung der If-Anweisung angehalten

706
user691963

Ich bin verblüfft Ich verwende den folgenden Code auf einer 2012 R2-Box, während ich ihn entwickle. Alles, was dieses Stück tut, ist, den Hostnamen zu bekommen, die Nummer vom Ende zu holen, eine Funktion auszuführen, um zu sehen, ob es gerade oder ungerade ist, und dann den Speicherort darauf basierend festzulegen.

Aus irgendeinem Grund wird nach der If-Anweisung der Wert zurückgegeben, den das Skript beendet, sobald das Skript beendet ist. Wie Sie sehen, habe ich die write-debug-Nachricht "message 3" hinzugefügt, und es wird einfach nicht einmal registriert. Hat jemand von einem PS-Fallschirm für ein solches Szenario Bescheid? Oder habe ich irgendwo einen Fehler gemacht? Server führt WMF 4.0 aus.

function check-oddOrEven($number) { If([bool]!($number%2)) { $OddEvnResult = "Even" return $OddEvnResult } Else { $OddEvnResult = "Odd" return $OddEvnResult } }  Write-Debug "message1" -debug  $oddStrgPath = "C:\ClusterStorage\Volume1" $evnStrgPath = "C:\ClusterStorage\Volume2"  $hostname = $env:computername #$hostname = "testN02" $OddEvnSplit = $hostname.split('N')[1]  Write-Debug "message2" -debug  $OddEvnResult = check-oddOrEven $OddEvnSplit if ($OddEvnResult -eq "Odd") { write-host "Odd number in hostname detected (1,3,5..etc). Setting storage path to" $oddStrgPath #set-vmhost -VirtualHardDiskPath $oddStrgPath -VirtualMachinePath $oddStrgPath $OEresult= $oddStrgPath return $OEresult } else { write-host "Even number in hostname detected (2,4,6..etc). Setting storage path to" $evnStrgPath #set-vmhost -VirtualHardDiskPath $evnStrgPath -VirtualMachinePath $oddStrgPath $OEresult= $evnStrgPath return $OEresult }  Write-Debug "message3" -debug 

Ich habe Write-Host und Write-Output auch ohne Erfolg ausprobiert. Hier ist die Ausgabe von der Konsole:

DEBUG: message1 DEBUG: message2 Even number in hostname detected (1,3,5..etc). Setting storage path to C:\ClusterStorage\Volume2 C:\ClusterStorage\Volume2 
1
Hallo, habe gerade versucht, dein Problem zu reproduzieren. Entfernen Sie die "return" -Anweisung am Ende Ihrer "if" - und "else" -Blöcke, und es funktioniert. Jetzt überlasse ich es dir, das Verhalten zu verstehen;) Ob1lan vor 7 Jahren 0

1 Antwort auf die Frage

3
Ob1lan

Bitte lesen Sie diesen Beitrag von StackOverflow über die 'return'-Anweisung. Hier ist die Zusammenfassung:

Zurück : Damit kehren Sie zum vorherigen Anrufpunkt zurück. Wenn Sie diesen Befehl von einem Skript aus aufrufen (außerhalb von Funktionen), kehrt er zur Shell zurück. Wenn Sie diesen Befehl von der Shell aus aufrufen, kehrt er zur Shell zurück. Dies ist der vorherige Aufrufpunkt für einen einzelnen von der Shell ausgeführten Befehl . Wenn Sie diesen Befehl von einer Funktion aus aufrufen, kehrt er zu dem Punkt zurück, von dem aus die Funktion aufgerufen wurde.

Die Ausführung aller Befehle nach dem Aufrufpunkt, an den sie zurückgegeben wird, wird ab diesem Punkt fortgesetzt. Wenn ein Skript von der Shell aus aufgerufen wird und es den Return-Befehl außerhalb von Funktionen enthält, gibt es bei der Rückkehr zur Shell keine weiteren Befehle mehr, sodass ein Return auf diese Weise im Wesentlichen mit Exit identisch ist.

Daher müssen Sie die return-Anweisung aus Ihrem 'if' und 'else' entfernen, wobei nur die Variable ihren Inhalt anzeigen muss.

Beispiel:

 if ($OddEvnResult -eq "Odd") { write-host "Odd number in hostname detected (1,3,5..etc). Setting storage path to" $oddStrgPath #set-vmhost -VirtualHardDiskPath $oddStrgPath -VirtualMachinePath $oddStrgPath $OEresult= $oddStrgPath $OEresult } else { write-host "Even number in hostname detected (2,4,6..etc). Setting storage path to" $evnStrgPath #set-vmhost -VirtualHardDiskPath $evnStrgPath -VirtualMachinePath $oddStrgPath $OEresult= $evnStrgPath $OEresult }