PowerShell函数意外返回PSRemotingJob对象致&调用失败问题
PowerShell Job导致函数返回额外对象的问题分析与解决
为什么函数会返回System.Management.Automation.PSRemotingJob对象?
PowerShell函数默认会把所有未被捕获/重定向的输出都纳入返回流。你调用Start-Job时,这个命令本身会返回一个Job对象,如果没把这个对象存到变量里,也没把它的输出丢去$null,它就会和你最后要返回的路径变量一起被函数返回,变成一个混合数组。
举个实际的错误代码示例:
function Get-BinariesPath { $confirm = Read-Host "确认执行?(Y/N)" if ($confirm -eq 'Y') { # 这里Start-Job的输出直接进入函数返回流 Start-Job -ScriptBlock { Get-Item "C:\some\path" } Wait-Job -Id (Get-Job).Id | Out-Null $SomePathVariable = (Receive-Job -Id (Get-Job).Id).FullName return $SomePathVariable } }
上面的代码里,Start-Job返回的Job对象没被处理,直接跟着$SomePathVariable一起成为函数的返回值。
怎么解决这个问题?
两种简单有效的处理方式:
- 把Job对象捕获到变量中:
直接把Start-Job的结果存进变量,这样它的输出就不会流入函数的返回流:function Get-BinariesPath { $confirm = Read-Host "确认执行?(Y/N)" if ($confirm -eq 'Y') { # 捕获Job对象到变量,阻止它进入返回流 $job = Start-Job -ScriptBlock { Get-Item "C:\some\path" } Wait-Job -Id $job.Id | Out-Null $SomePathVariable = (Receive-Job -Id $job.Id).FullName return $SomePathVariable } } - 将
Start-Job的输出重定向到$null:
如果不需要保留Job对象,可以直接把输出丢去空值,彻底阻止它出现在返回流里:Start-Job -ScriptBlock { Get-Item "C:\some\path" } | Out-Null
另外要注意:Receive-Job的输出如果已经处理过,也要确保它不会意外混入返回流——比如把结果存到变量里,而不是直接让它输出。
为什么Job会干扰后续的&调用?
当函数返回的是一个包含Job对象和路径的混合数组时,你执行& "$SomePathVariable"时,PowerShell会把整个数组转换成字符串,结果会变成类似System.Management.Automation.PSRemotingJob C:\path\to\binary.exe的内容。这显然不是一个有效的可执行文件路径,自然会报错说无法识别这个组合。
本质上就是&需要单一的字符串路径,但你传入的是一个混合了对象和字符串的数组,转换后的内容完全不符合要求,导致调用失败。
内容的提问来源于stack exchange,提问作者pf12345678910
相关产品推荐
相关产品推荐

