O script do PowerShell para após executar a instrução If

O script do PowerShell para após executar a instrução If

Estou perplexo. Estou executando o código abaixo em uma caixa 2012 R2 enquanto o desenvolvo. Tudo o que essa peça faz é obter o nome do host, pegar o número do final, executar uma função para ver se é ímpar ou par e, em seguida, definir o local de armazenamento com base nisso.

Por alguma razão, depois que a instrução If retorna o valor, o script simplesmente para de ser executado como se o script tivesse terminado. Como você pode ver, adicionei write-debug "mensagem 3" e ele simplesmente nem mesmo é registrado. Alguém sabe de alguma pegadinha do PS para um cenário como esse? Ou será que cometi algum erro em algum lugar. O servidor está executando o 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

Eu tentei write-host e write-output sem sucesso também. Aqui está a saída do console:

DEBUG: message1
DEBUG: message2
Even number in hostname detected (1,3,5..etc). Setting storage path to C:\ClusterStorage\Volume2
C:\ClusterStorage\Volume2

Responder1

Por favor leiaesta postagem do StackOverflowsobre a declaração de 'retorno'. Aqui está o resumo:

Retornar: Isso vairetornar ao ponto de chamada anterior. Se você chamar este comando a partir de um script (fora de qualquer função), ele retornará ao shell. Se você chamar este comando a partir do shell, ele retornará ao shell (que é o ponto de chamada anterior para um único comando executado a partir do shell). Se você chamar este comando a partir de uma função, ele retornará para o local de onde a função foi chamada.

A execução de quaisquer comandos após o ponto de chamada para o qual ele retorna continuará a partir desse ponto. Se um script for chamado a partir do shell e contiver o comando Return fora de qualquer função, quando ele retornar ao shell não haverá mais comandos para executar, tornando assim um Return usado dessa forma essencialmente igual a Exit.

Então,você tem que remover a declaração de retorno do seu 'if' e 'else', deixando apenas a variável para exibir seu conteúdo.

Exemplo:

    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
}

informação relacionada