无法捕获 NoProcessFoundForGivenName

pau*_*lhr 3 powershell

我有一个 powershell 脚本,可以关闭 MS Word 中打开的文件名与模式匹配的所有 MS Word 实例。有时会调用 Powershell 脚本,但没有运行 MS Word 实例。cmdlet Get-Process 用于查找 MS Word 并检查当前打开的文件的名称。

无论是 [NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand] 还是
[Microsoft.PowerShell.Commands.GetProcessCommand] 都被捕获。

{
   $MSWordProcessHandle = Get-Process WINWORD
} catch [NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand] {
   Write-Output "No instances of MS Word found running."
}
Run Code Online (Sandbox Code Playgroud)

我不断收到下面的错误。

Get-Process : Cannot find a process with the name "WINWORD". Verify the process name and call the cmdlet again.  
At C:\Utils\scripts\Dev_Set_Close.ps1:24 char:27  
+    $MSWordProcessHandle = Get-Process WINWORD  
+                           ~~~~~~~~~~~~~~~~~~~  
    + CategoryInfo          : ObjectNotFound: (WINWORD:String) [Get-Process], ProcessCommandException  
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand
Run Code Online (Sandbox Code Playgroud)

Mik*_*ard 8

首先,您需要使用-ErrorAction Stop强制非终止错误成为异常。

然后,当您无法弄清楚要捕获哪些特定异常时,Lee 捕获所有内容的建议会很有帮助:

try {
   $MSWordProcessHandle = Get-Process WINWORD -ErrorAction Stop 
} catch {
  $_.Exception.GetType().FullName
}
Run Code Online (Sandbox Code Playgroud)

这输出Microsoft.PowerShell.Commands.ProcessCommandException

所以,这就是你想要的:

try {
   $MSWordProcessHandle = Get-Process WINWORD -ErrorAction Stop 
} catch [Microsoft.PowerShell.Commands.ProcessCommandException]{
   Write-Output "No instances of MS Word found running."
}
Run Code Online (Sandbox Code Playgroud)