我见过很多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打印,代码分析或类似的东西。
答案 0 :(得分:0)
我认为这很清楚。 你得到的第一个错误并不重要。它就是" shell的回声:" $壳 你需要至少像" shell:$ shell"或者" shell:" + $ shell $ file
相同第二个是关键的。 您尝试将null发送到foreach-object。
因此,如果您不调整默认错误行为。 他将吞下第一个错误并在第二个错误中失败。
顺便尝试使用write-host而不是echo。 如果你认为像powershell一样,你将会像powershell一样。