无法将参数绑定到参数'命令'因为它是null。电源外壳

时间:2017-07-27 17:34:38

标签: powershell start-job

我有一个类似下面代码的功能。它接收命令和命令参数。我必须在后台运行此命令并收集输出。但最后一句话让我误以为这个错误

错误:

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

我很确定最后一行是抛出错误的那一行。

4 个答案:

答案 0 :(得分:4)

除了$sb之外,将-argumentlist纳入脚本块范围的另一种方法是使用$using:范围。 (PowerShell 3 +)

$cmd = 'Get-content'
$Arg = 'path to file'
$sb = "$cmd $Arg -ErrorVariable e -ErrorAction Stop"
$job = Start-job -ScriptBlock {Invoke-Expression $using:sb}
wait-job -id $job.Id
$job | Receive-job

答案 1 :(得分:2)

这里的问题是你实际上没有给Invoke-Expression命令。

每当您创建新上下文(在本例中为作业)时,您将失去对父会话环境的访问权限。在您的情况下,$sb目前为空。

您管理此方法的方法是通过-ArgumentList的{​​{1}}参数将值作为参数传递:

Start-Job

为了便于将$ sb交给ScriptBlock,你可以这样做:

start-job -ScriptBlock {} -ArgumentList

这可能令人困惑,所以这是用更友好的名字编写的相同代码:

$sb = "$cmd $Arg -ErrorVariable e -ErrorAction Stop"
$job = start-job -ScriptBlock { Param([string]$sb)
    Invoke-Expression $sb
} -ArgumentList $sb

答案 2 :(得分:0)

我遇到了同样的错误,但是当我使用管理员权限运行PowerShell时,却没有收到此错误。祝你好运!

答案 3 :(得分:0)

在没有适当授权的情况下与用户运行命令时,我也遇到相同的错误。 确实可以与此相关。 例如我的代码:

$allParams = @(10, "Some Process")

Start-Job -ScriptBlock $restartProcessRobot -ArgumentList $allParams

<#
@descr
    Function that restarts given proces -DisplayName after given number of seconds.
@param1 Integer number of seconds after which the process should be restarted.
@param2 String  display name of process(es) that must be affected. Wild cards accepted.
#>
$restartServiceAfter = { 
    param($seconds, $processName)
    Start-Sleep $seconds
    Restart-Service -DisplayName $processName -Force
}

并且用户无权重新启动服务。