PowerShell 2.0以及如何处理异常?

PowerShell 2.0以及如何处理异常?,powershell,exception-handling,powershell-2.0,Powershell,Exception Handling,Powershell 2.0,为什么运行这两个简单示例时会在控制台上打印错误消息? 我希望在控制台上打印“错误测试:)”而不是: 获取WmiObject:RPC服务器正在运行 不可用的(HRESULT的例外情况: 0x800706BA)第3行字符:15 +获取WmiObject第一个示例 错误发生在编译/解析时(PowerShell足够聪明),因此代码甚至没有执行,实际上它无法捕获任何内容。请尝试此代码,您将捕获一个异常: try { $x = 0 $i = 1/$x Write-Host $i }

为什么运行这两个简单示例时会在控制台上打印错误消息? 我希望在控制台上打印“错误测试:)”而不是:

获取WmiObject:RPC服务器正在运行 不可用的(HRESULT的例外情况: 0x800706BA)第3行字符:15
+获取WmiObject第一个示例

错误发生在编译/解析时(PowerShell足够聪明),因此代码甚至没有执行,实际上它无法捕获任何内容。请尝试此代码,您将捕获一个异常:

try
{
    $x = 0
    $i = 1/$x
    Write-Host $i
}
catch [Exception]
{
    Write-Host "Error testing :)"
}

第二个示例

如果全局设置
$ErrorActionPreference='Stop'
,则会按预期打印“错误测试:)”。但是您的
$ErrorActionPreference
可能是
'Continue'
:在这种情况下,没有终止错误/异常,您只需通过引擎将非终止错误消息打印到主机上即可

除了全局
$ErrorActionPreference
选项,您还可以使用
Get WmiObject
参数
ErrorAction
。尝试将其设置为
Stop
,您将捕获异常

try
{
    Get-WmiObject -ErrorAction Stop -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk
}
catch [Exception]
{
    Write-Host "Error testing :)"
}

因此,如果$ErrorActionPreference设置为“Continue”(这是默认设置),您只需打印错误表并正常继续脚本?如果$ErrorActionPreference设置为“Stop”,那么脚本执行是否会在第一次未处理的异常时停止?是的,完全正确。就我个人而言,我觉得这个默认选项令人困惑,而且有点危险:它可能会经常导致意外的延续。默认情况下,我更喜欢“停止”,这就是我在PS配置文件中首先要做的。您还可以使用公共参数
-ErrorAction SilentlyContinue
抑制它,并使用公共参数
-ErrorVariable someVariableName
捕获错误,以便您可以测试它:
获取WmiObject-ComputerName.Noexisting.domain.com-Credential(获取凭据)-类Win32_logicaldisk-ErrorAction SilentlyContinue-ErrorVariable noWMI;if($noWMI){写入主机“错误测试:)”}
try
{
    $x = 0
    $i = 1/$x
    Write-Host $i
}
catch [Exception]
{
    Write-Host "Error testing :)"
}
try
{
    Get-WmiObject -ErrorAction Stop -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk
}
catch [Exception]
{
    Write-Host "Error testing :)"
}