Как я могу выйти из функции в powershell
У меня есть функция, которая, я знаю, выдаст ошибку. Эта ошибка ожидается, но когда она выдается, я хочу завершить функцию. У меня есть раздел Trap в моем сценарии, и я использовал оба Return
и Break
команды, но они не делают то, что я хочу. У меня есть заявление ловушки как в Begin {}
и Process {}
разделы. Я использую команду Get-WmiObject
и у меня есть -ErrorAction
установлен в stop
, Образец кода и их ответы приведены ниже.
Первый пример с возвратом:
Function Test {
Param {"Some Parameters"}
Begin {"Some beginning stuff"}
process {
Trap
{
Add-Content $($SomeFile) $($ComputerName + "is Not There")
return
} #End Trap
Get-WmiObject Win32_NTLogEvent `
-ComputerName $ComputerName `
-Credential $Cred - `
-ErrorAction Stop
}#End Process
End {"Some ending things"}
} #End Function
Этот просто продолжается, не выходя из функции.
Второй пример с перерывом:
Function Test {
Param {"Some Parameters"}
Begin {"Some beginning stuff"}
process {
Trap
{
Add-Content $($SomeFile) $($ComputerName + "is Not There")
Break
} #End Trap
Get-WmiObject Win32_NTLogEvent `
-ComputerName $ComputerName `
-Credential $Cred - `
-ErrorAction Stop
}#End Process
End {"Some ending things"}
} #End Function
Этот выходит весь сценарий.
Я посмотрел вокруг, но я не могу найти что-то конкретное для выхода только из функции. В этой функции происходит гораздо больше, в том числе другая Get-WmiObject
команда. Я хочу выйти из функции, если первый Get-WmiObject
не могу связаться с компьютером. Я не могу использовать тест ping, потому что многие серверы блокируют ICMP.
3 ответа
$?
переменная может быть хороша для ловли ошибок. Он содержит логическое значение для последней выполненной команды. Если команда была выполнена без ошибок $? = $true
, $?
будет $false
когда последняя выполненная команда ошиблась.
Создайте логическое значение, которое устанавливается каждый раз после команды, которая выдает ошибку. Предполагая, что команда здесь get-wmiObject:
$running = $true
While ($running) {
Get-WmiObject Win32_NTLogEvent -ComputerName $ComputerName -Credential $Cred
$running = $?
}
Поскольку у вас, возможно, уже есть условие в вашем цикле, это будет выглядеть примерно так: while(<condition> -and $running)
И если вы хотите добавить свое сообщение об ошибке, просто добавьте что-нибудь после того, как вы настроите запуск таким образом
if(!$running){Add-Content $($SomeFile) $($ComputerName + "is Not There") }
Возвращение на самом деле не поможет, но вы можете использовать break, единственное требование - использовать его так, как было задумано - чтобы выйти из цикла...:)
Хитрость в том, чтобы создать простой цикл, который будет запускаться только один раз, независимо от того, что используется, и использовать разрыв внутри цикла:
# Script body...
do {
Test-WithBreak
} until ($true)
# Other operations you want to perform even if Test-WithBreak breaks.
Причиной этого является тот факт, что break является директивой цикла, а в PowerShell это не заботится о каких-либо ограничениях (поэтому разрыв сценария, запуск сценария, запуск сценария смогут пройти весь путь вверх и уничтожить все, если это не найти какую-то петлю, чтобы остановить его).
Я писал об этой проблеме некоторое время назад.
Попробуйте "Продолжить" в качестве ключевого слова