如何退出powershell中的一个函数

如何退出powershell中的一个函数

我有一个函数,我知道它会抛出一个错误。这个错误是预料之中的,但是当它被抛出时,我想结束该函数。我的脚本中有一个 Trap 部分,我使用了和命令ReturnBreak但它们并没有达到我想要的效果。我在Begin {}Process {}部分中都有 trap 语句。我正在使用命令 Get-WmiObject,并且我将设置-ErrorActionstop。代码示例及其响应如下。

第一个例子(带回报):

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。

答案1

$?变量可以很好地捕获错误。它包含一个布尔值,表示最后执行的命令。如果命令执行时没有错误$? = $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")  }

答案2

事实上,Return 没有帮助,但你可以使用 break,唯一的要求是按照它的设计使用它 - 退出循环...:)

这里的技巧是构建一个无论如何都只运行一次的简单循环,并在循环内使用 break:

# Script body...

do {
    Test-WithBreak
} until ($true)

# Other operations you want to perform even if Test-WithBreak breaks.

其背后的原因是,break 是循环指令,而在 PowerShell 中它不关心任何限制(因此,在脚本中中断,从脚本中运行,从脚本中运行将能够一直走到最后并终止整个过程,除非它找到一些循环来阻止他)。

已发表于博客关于这个问题。

答案3

尝试“继续”作为关键字

陷阱 [异常] {“在 PowerShell 中”}

相关内容