PowerShell-Skript wird nach Ausführung der If-Anweisung beendet

PowerShell-Skript wird nach Ausführung der If-Anweisung beendet

Ich bin ratlos. Ich führe den folgenden Code auf einer 2012 R2-Box aus, während ich ihn entwickle. Dieser Teil ruft lediglich den Hostnamen ab, nimmt die Nummer am Ende, führt eine Funktion aus, um zu sehen, ob es sich um eine gerade oder ungerade Zahl handelt, und legt dann den Speicherort basierend darauf fest.

Aus irgendeinem Grund wird das Skript einfach beendet, nachdem die If-Anweisung den Wert zurückgegeben hat, als wäre es beendet. Wie Sie sehen, habe ich write-debug „Nachricht 3“ hinzugefügt, aber es wird einfach nicht einmal registriert. Kennt jemand PS-Fallstricke für ein Szenario wie dieses? Oder habe ich irgendwo einen Fehler gemacht? Auf dem Server läuft WMF 4.0.

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 ebenfalls erfolglos 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

Antwort1

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

Zurückkehren: Dieser WilleRückkehr zum vorherigen Aufrufpunkt. Wenn Sie diesen Befehl aus einem Skript (außerhalb von Funktionen) aufrufen, kehrt er zur Shell zurück. Wenn Sie diesen Befehl aus der Shell aufrufen, kehrt er zur Shell zurück (was der vorherige Aufrufpunkt für einen einzelnen Befehl ist, der aus der Shell ausgeführt wurde).. Wenn Sie diesen Befehl aus einer Funktion aufrufen, kehrt er dorthin zurück, von wo aus die Funktion aufgerufen wurde.

Die Ausführung aller Befehle nach dem Aufrufpunkt, zu dem es zurückgekehrt ist, wird von diesem Punkt aus fortgesetzt. Wenn ein Skript von der Shell aufgerufen wird und es den Return-Befehl außerhalb von Funktionen enthält, sind bei der Rückkehr zur Shell keine weiteren Befehle mehr auszuführen, sodass ein auf diese Weise verwendeter Return im Wesentlichen dasselbe ist wie Exit.

Also,Sie müssen die return-Anweisung aus Ihrem 'if' und 'else' entfernen., sodass nur die Variable übrig bleibt, um ihren Inhalt anzuzeigen.

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
}

verwandte Informationen