ErrorActionPreference =“Stop”会生成误导性错误消息

时间:2017-01-05 15:34:49

标签: powershell

我见过很多New-Object -ComObject Shell.Application寻找可以对其他文件执行操作的解决方案。 (就我而言,安装字体)。

虽然它在交互模式下工作正常:

PS C:\> New-Object -ComObject 'Shell.Application'

Application        Parent
-----------        ------
System.__ComObject System.__ComObject

我在PowerShell脚本中没有这样做:

function Install-Font {
   Param (
      [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
      [System.IO.FileSystemInfo[]]
      $Files
   )
   $shell = New-Object -ComObject Shell.Application
   echo "Shell: " $shell
   echo "Files: " $Files
   $Files | ForEach-Object {
      $Fonts = $shell.NameSpace($_.Directory.Name)
      $font = $Fonts.ParseName($_.Name)
      $font.InvokeVerb("Install")
   }
}

$ErrorActionPreference = "Stop"
Get-ChildItem $env:TEMP\FiraCode\ttf -Filter *.ttf -File | Install-Font

输出:

PS C:\Users\villasv\Code\WindowsProSetup> .\testB.ps1
Shell:

ForEach-Object : You cannot call a method on a null-valued expression.
At C:\Users\villasv\Code\WindowsProSetup\testB.ps1:10 char:13
+    $Files | ForEach-Object {
+             ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [ForEach-Object], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull,Microsoft.PowerShell.Commands.ForEachObjectCommand

观察$ErrorActionPreference = "Stop"表现得非常可疑。如果我将其删除,则错误完全不同:

PS C:\Users\villasv\Code\WindowsProSetup> .\testB.ps1
Shell:

Application        Parent
-----------        ------
System.__ComObject System.__ComObject
Files:

You cannot call a method on a null-valued expression.
At C:\Users\villasv\Code\WindowsProSetup\testB.ps1:12 char:7
+       $font = $Fonts.ParseName($_.Name)
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At C:\Users\villasv\Code\WindowsProSetup\testB.ps1:13 char:7
+       $font.InvokeVerb("Install")
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

调试脚本后,我可以确认shell是否正确实例化,$Files参数也不为空。

真正的错误是我删除ErrorActionPreference时显示的错误。对我来说,这只能意味着这个设置搞乱了stdout打印,代码分析或类似的东西。

1 个答案:

答案 0 :(得分:0)

我认为这很清楚。 你得到的第一个错误并不重要。它就是" shell的回声:" $壳 你需要至少像" shell:$ shell"或者" shell:" + $ shell $ file

相同

第二个是关键的。 您尝试将null发送到foreach-object。

因此,如果您不调整默认错误行为。 他将吞下第一个错误并在第二个错误中失败。

顺便尝试使用write-host而不是echo。 如果你认为像powershell一样,你将会像powershell一样。