我有一个函数,我知道它会抛出一个错误。这个错误是预料之中的,但是当它被抛出时,我想结束该函数。我的脚本中有一个 Trap 部分,我使用了和命令Return
,Break
但它们并没有达到我想要的效果。我在Begin {}
和Process {}
部分中都有 trap 语句。我正在使用命令 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。
答案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
尝试“继续”作为关键字