O script do PowerShell pára após a execução da instrução If

1

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

Por algum motivo, depois que a instrução If retorna o valor, o script simplesmente pára de funcionar como o script terminou. Como você pode ver, adicionei write-debug "message 3" e ele simplesmente não se registra. Alguém sabe de alguma armadilha PS para um cenário como este? Ou é que cometi algum erro em algum lugar. 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 já testei o write-host e o write-output sem sucesso. 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
    
por user691963 31.01.2017 / 06:59

1 resposta

3

Por favor, leia esta postagem do StackOverflow sobre a declaração 'return'. Aqui está o resumo:

Return: This will return to the previous call point. If you call this command from a script (outside any functions) it will return to the shell. If you call this command from the shell it will return to the shell (which is the previous call point for a single command ran from the shell). If you call this command from a function it will return to where ever the function was called from.

Execution of any commands after the call point that it is returned to will continue from that point. If a script is called from the shell and it contains the Return command outside any functions then when it returns to the shell there are no more commands to run thus making a Return used in this way essentially the same as 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
}
    
por 31.01.2017 / 08:03