2017-07-27 76 views
0

私は以下のコードに似た機能を持っていました。コマンドと引数を受け取ります。このコマンドをバックグラウンドで実行し、出力を収集する必要がありました。しかし、その最後の文は、このエラーで私を悩ませている引数が 'command'であるため、パラメータをバインドできません。 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 

コード:私は最後の行がエラーを投げ1であるかなり確信している

$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 

+1

*根本的な原因はわかりません。* '$ sb'はジョブの中に存在しません。 – PetSerAl

答えて

1

ここでの問題は、実際にInvoke-Expressionにコマンドを渡していないことです。

新しいコンテキスト(この場合はジョブ)を作成すると、親セッションの環境へのアクセスが失われます。あなたの場合$sbは現在nullです。

あなたがこれを管理する方法はStart-Job-ArgumentListパラメータを経由して、引数として値を渡すことです:あなたはこれを行うだろうのScriptBlockに手渡し$ SBを容易にするために

start-job -ScriptBlock {} -ArgumentList 

$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 

これは混乱することができますので、これは、より親しみやすい名前で書かれた同じコードであります210

+0

詳細な説明をありがとう。これで問題は解決しました。 しかし、エラーがInvoke-Expressionのものである場合、powershellは最後の行でエラーを投げていましたか? –

+0

'$ job'に' start-job'を指定すると、コマンドをスクリプトブロックの中に置いています。これはバックグラウンドでプロセスを開始します。最後の行で、そのジョブの出力を取得しています。あなたが見ているエラーは、そのジョブの出力です。 –

+0

ありがとう、今それはクリスタルクリアです。 –

3

$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 
関連する問題