无法将参数绑定到参数 'command',因为它为空。电源外壳
Cannot bind parameter to argument 'command' because it is null. Powershell
我有一个类似于下面代码的功能。它接收命令和命令参数。我不得不在后台 运行 这个命令并收集输出。但是最后一句话让我困扰这个错误
错误:
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
我很确定最后一行是抛出错误的那一行。
这里的问题是你实际上并没有给 Invoke-Expression
命令。
无论何时创建新上下文(在本例中为作业),您都会失去对父会话环境的访问权限。在您的情况下 $sb
当前为空。
您管理它的方法是通过 Start-Job
的 -ArgumentList
参数将值作为参数传递:
start-job -ScriptBlock {} -ArgumentList
为了便于将 $sb 传递给 ScriptBlock,您可以这样做:
$sb = "$cmd $Arg -ErrorVariable e -ErrorAction Stop"
$job = start-job -ScriptBlock { Param([string]$sb)
Invoke-Expression $sb
} -ArgumentList $sb
这可能会造成混淆,所以这是用更友好的名称编写的相同代码:
$OuterSB = "$cmd $Arg -ErrorVariable e -ErrorAction Stop"
$job = start-job -ScriptBlock { Param([string]$InnerSB)
Invoke-Expression $InnerSB
} -ArgumentList $OuterSB
除了 -argumentlist
之外,将 $sb
放入脚本块范围的另一种方法是使用 $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
我遇到了同样的错误,但是当我 运行 PowerShell 使用管理员权限时,我没有收到此错误。祝你好运!
当 运行 对没有适当授权的用户执行命令时,我也遇到了同样的错误。
这实际上可能与此有关。
例如我的代码:
$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
}
并且用户无权重新启动服务。
我有一个类似于下面代码的功能。它接收命令和命令参数。我不得不在后台 运行 这个命令并收集输出。但是最后一句话让我困扰这个错误
错误:
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
我很确定最后一行是抛出错误的那一行。
这里的问题是你实际上并没有给 Invoke-Expression
命令。
无论何时创建新上下文(在本例中为作业),您都会失去对父会话环境的访问权限。在您的情况下 $sb
当前为空。
您管理它的方法是通过 Start-Job
的 -ArgumentList
参数将值作为参数传递:
start-job -ScriptBlock {} -ArgumentList
为了便于将 $sb 传递给 ScriptBlock,您可以这样做:
$sb = "$cmd $Arg -ErrorVariable e -ErrorAction Stop"
$job = start-job -ScriptBlock { Param([string]$sb)
Invoke-Expression $sb
} -ArgumentList $sb
这可能会造成混淆,所以这是用更友好的名称编写的相同代码:
$OuterSB = "$cmd $Arg -ErrorVariable e -ErrorAction Stop"
$job = start-job -ScriptBlock { Param([string]$InnerSB)
Invoke-Expression $InnerSB
} -ArgumentList $OuterSB
除了 -argumentlist
之外,将 $sb
放入脚本块范围的另一种方法是使用 $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
我遇到了同样的错误,但是当我 运行 PowerShell 使用管理员权限时,我没有收到此错误。祝你好运!
当 运行 对没有适当授权的用户执行命令时,我也遇到了同样的错误。 这实际上可能与此有关。 例如我的代码:
$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
}
并且用户无权重新启动服务。