Как я могу выйти из функции в 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 это не заботится о каких-либо ограничениях (поэтому разрыв сценария, запуск сценария, запуск сценария смогут пройти весь путь вверх и уничтожить все, если это не найти какую-то петлю, чтобы остановить его).

Я писал об этой проблеме некоторое время назад.

Попробуйте "Продолжить" в качестве ключевого слова

Ловушка [Исключение] {"В PowerShell"}

Другие вопросы по тегам