我有两个服务,其中一个服务名称是错误的(Spooler1)。当我运行调用命令使用try catch块来停止服务时,结果是错误的消息。
的例子:
[array]$Services = "spooler1","spooler"
$ComputerName = 'localhost'
For ($i=0; $i -lt $Services.Count; $i++)
{
Try
{
#Stop service
Invoke-Command -ComputerName $ComputerName -ScriptBlock {param($Service) Stop-Service $Service} -ArgumentList $Services[$i]
Write-Host "Try Block"
}
Catch
{
Write-Host "Catch Block"
}
}
结果:
Cannot find any service with service name 'spooler1'.
+ CategoryInfo : ObjectNotFound: (spooler1:String) [Stop-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.StopServiceCommand
+ PSComputerName : localhost
Try Block
Try Block
当我在Powershell脚本上面运行时,结果是两个服务的消息'Try Block'。
结果应该是
Catch Block
Try Block
我们有解决这个问题的方法吗
在调用命令语句的末尾添加ErrorAction stop后,它正确地处理错误。
..
Invoke-Command -ComputerName $ComputerName -ScriptBlock {param($Service) Stop-Service $Service} -ArgumentList $Services[$i] -ErrorAction Stop
结果:Catch Block
Try Block
Invoke-Command
在找不到第一个服务时返回非终止错误,这使得不触发catch{}
块
正如您所发现的,通过显式指定-ErrorAction Stop
,这会导致来自cmdlet的错误被作为终止错误处理,从而触发catch{}
。