我有一个类似于下面代码的函数。它接收命令和命令参数。我必须在后台运行这个命令并收集输出。但最后一条语句让我感到困惑
错误:
Cannot bind argument to parameter 'Command' because it is null.
+ CategoryInfo : InvalidData: (:) [Invoke-Expression], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.InvokeExpre
ssionCommand
+ PSComputerName : localhost
验证码:
$cmd = 'Get-content'
$Arg = 'path to file'
$sb = "$cmd $Arg -ErrorVariable e -ErrorAction Stop"
invoke-Expression $sb #This printsoutput
$job = Start-job -ScriptBlock {Invoke-Expression $sb}
wait-job -id $job.Id
$job | Receive-job #this should print output but throwing error
我很确定最后一行是抛出错误的那一行。
5条答案
按热度按时间bgtovc5b1#
除了
-argumentlist
之外,将$sb
放入脚本块作用域的另一种方法是使用$using:
作用域。(PowerShell 3+)kiayqfof2#
这里的问题是您实际上并没有给
Invoke-Expression
一个命令。每当你创建一个新的上下文(在本例中是一个作业),你就失去了对父会话环境的访问权。
管理此操作的方法是通过
Start-Job
的-ArgumentList
参数将值作为参数传递:为了方便将$sb交给ScriptBlock,你可以这样做:
这可能会让人感到困惑,所以这是用更友好的名称编写的相同代码:
sqserrrh3#
我得到了同样的错误,但当我使用管理员权限运行PowerShell时,我没有得到此错误。祝你好运!
4c8rllxm4#
我也得到了相同的错误时运行命令与用户没有适当的授权.这在事实上可以相关.例如我的代码:
用户无权重新启动服务。
mznpcxlj5#
当我的conda环境的名称中有一个错字时,我得到了这个错误:它是
env2
而不是env3
。