У меня есть функция, которая, как я знаю, вызовет ошибку. Эта ошибка ожидаема, но когда она выдается, я хочу завершить функцию. В моем скрипте есть раздел 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.
Return на самом деле не поможет, но вы можете использовать break, единственное требование - использовать его так, как было задумано - чтобы выйти из цикла ... :)
Уловка заключается в том, чтобы создать простой цикл, который будет запускаться только один раз, независимо от того, что и использовать break внутри цикла:
# Script body...
do {
Test-WithBreak
} until ($true)
# Other operations you want to perform even if Test-WithBreak breaks.
Причина этого заключается в том, что break - это директива цикла, а в PowerShell она не заботится о каких-либо ограничениях (так что break в скрипте, запуск из скрипта, запуск из скрипта сможет пройти весь путь и убить все это, если он не найдет какую-нибудь петлю, чтобы остановить его).
я блоггинг об этом вопросе некоторое время назад.
В $?
varible может быть полезен для поиска ошибок. Он содержит логическое значение для последней выполненной команды. Если команда была выполнена без ошибок $? = $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") }
Попробуйте использовать ключевое слово "Продолжить"