Назад | Перейти на главную страницу

Как выйти из функции в 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.

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")  }

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

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