Сценарий PowerShell останавливается после выполнения оператора If

669
user691963

Я в тупике. Я запускаю приведенный ниже код на коробке 2012 R2, пока я его разрабатываю. Все, что делает эта часть, это получает имя хоста, захватывает число с конца, запускает функцию, чтобы увидеть, является ли она нечетной или четной, а затем устанавливает местоположение хранилища на основе этого.

По какой-то причине после того, как оператор If возвращает значение, сценарий просто останавливается, как если бы сценарий завершился. Как вы можете видеть, я добавил запись-отладку «сообщение 3», и она просто даже не регистрируется. Кто-нибудь знает какие-либо ошибки в PS для такого сценария? Или я где-то допустил ошибку. Сервер работает под управлением 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 

Я попытался написать-хост и запись-вывод, но безуспешно. Вот вывод из консоли:

DEBUG: message1 DEBUG: message2 Even number in hostname detected (1,3,5..etc). Setting storage path to C:\ClusterStorage\Volume2 C:\ClusterStorage\Volume2 
1
Здравствуйте, только что попытался воспроизвести вашу проблему. Удалите оператор return в конце ваших блоков if и else, и он будет работать. Теперь я оставляю это на ваше усмотрение, чтобы понять поведение;) Ob1lan 7 лет назад 0

1 ответ на вопрос

3
Ob1lan

Пожалуйста, прочитайте этот пост от StackOverflow об операторе return. Вот резюме:

Возврат : возврат к предыдущему пункту вызова. Если вы вызовете эту команду из скрипта (вне каких-либо функций), она вернется в оболочку. Если вы вызовете эту команду из оболочки, она вернется в оболочку (которая является предыдущей точкой вызова для одной команды, запущенной из оболочки) . Если вы вызываете эту команду из функции, она вернется туда, откуда была вызвана функция.

Выполнение любых команд после точки вызова, в которую она возвращается, будет продолжено с этой точки. Если скрипт вызывается из оболочки и содержит команду Return вне каких-либо функций, то, когда он возвращается в оболочку, больше нет команд для выполнения, что делает использование Return таким же образом, как и Exit.

Таким образом, вы должны удалить оператор return из ваших «if» и «else», оставив только переменную для отображения ее содержимого.

Пример:

 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 }