PowerShell中的$ ErrorActionPreference和$ ErrorAction cmdlet有什么区别?

众所周知,$ErrorActionPreference$ErrorAction都具有相同的功能,并且都通过将“终止错误”转换为“终止错误”来处理终止错误。但是,当同时使用两个变量时,我们需要知道哪个优先。

$ErrorActionPreference变量在脚本开始时使用,而$erroraction变量是公共参数并与cmdlet一起使用。在某些情况下,我们可能需要在发生错误后立即终止脚本,但是在脚本内部,我们有一些cmdlet,如果发生错误,则需要忽略或继续执行这些cmdlet。在这种情况下,我们-ErrorAction很重要,并且它具有优先权。

示例

$ErrorActionPreference = "Stop"
try{
   Get-Service -Name ABC
   Get-Process powershell
   Get-Process chromesds
   Get-Service Spooler
}
catch{
   $_.Exception.Message
}

输出结果

Cannot find any service with service name 'ABC'.

在上面的示例中,脚本终止,因为ABC服务名称不存在,并且由于该原因,由于$ErrorActionPreference值设置为Stop,因此下一条命令无法执行。一旦在Get-Service命令中添加-ErrorAction,它将具有优先权。

$ErrorActionPreference = "Stop"
try{
   Get-Service -Name ABC -ErrorAction Continue
   Get-Process powershell
   Get-Process chromesds
   Get-Service Spooler
}
catch{
   $_.Exception.Message
}

输出结果

Line |
   4 |       Get-Service -Name ABC -ErrorAction Continue
     |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot find any service with service name 'ABC'.
NPM(K)    PM(M)    WS(M)    CPU(s)    Id    SI    ProcessName
------    -----    -----    ------    --    --    -----------
43       234.39    11.33    49.17    7668    1    powershell
Cannot find a process with the name "chromesds". Verify the process name and call
the cmdlet again.

一旦添加带有Continue值的-ErrorAction参数,执行将移至如上输出所示的下一个命令,并在找不到进程名称“ Chromesds”并且无法执行下一个命令时停止执行,因为-ErrorAction在本文中未提及该命令。