2012-03-29 6 views
3

リモートコンピュータでps1スクリプトを実行する必要があります。スクリプトには、ファイル名を表す単一のパラメータが渡されます。私はスクリプトブロックにパラメータを渡すために多くの、多くの異なる組み合わせとアプローチを試みましたが、スクリプト名やファイル名にスペースをサポートしようとすると、常に1つのエラーまたは別のものが発生しますPowerShell Invoke-CommandとScripBlocksに引用されたパラメータを渡すには

注:最終結果は、コマンドを起動するために-ComputerNameパラメーターを使用してREMOTEコンピュータではなく、シンプルさとローカルで実行されるすべての例をテストするためのスクリプトを実行します。

サンプル "リモート" スクリプトは

#processFile.ps1 
$args[0]  # just outputs the first parameter passed 

$cmd = ".\processFile.ps1" 
$fn = "someFile.csv" 
$sb = [ScriptBlock]::Create("$cmd $fn") 
Invoke-Command -ScriptBlock $sb 

# outputs the correct 
someFile.csv 

ただし名にスペースが含まれないとき、作品を以下の、次は動作しません考えると

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("$cmd $fn") 
Invoke-Command -ScriptBlock $sb 

# outputs the incorrect 
some 

明らかに、ファイル名パラメータはエスケープして「some File」として渡す必要があります。 csv "と表示されます。私は、スクリプト名に、このスペースのサポートを拡張しようとすると、これは、以下の

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("$cmd `"$fn`"") # notice the escape $fn parameter 
Invoke-Command -ScriptBlock $sb 

# outputs the correct 
some File.csv 

しかしで行うことができ、すべてが崩壊してしまいます。以下は、次の例外

Exception calling "Create" with "1" argument(s): "Unexpected token 'some File.csv' in expression or statement." 

私が試してみましたが、多くの、多くの異なるアプローチがなされてきたすべてのものと

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("`"$cmd`" `"$fn`"") # notice the attempt to escape both parameters 

を失敗し、類似した何かをもたらしています。私は、両方のパラメータをエスケープするようには思えません。 (実際には、問題は、私は最初パラメータを免れることはできない以上です。私の試みのいくつかは

ありがとうネストされた引用符、単一引用符、[のScriptBlock] ::作成し、{}、$のExecutionContext、などが含まれています。、あなたが追加する必要がmjolinorによって受け入れ答え上の不可解な人にとって

$sb = [ScriptBlock]::Create(@" 
&'$cmd' '$fn' 
"@) 

答えて

4

これを試してみてください

. $sb

実際にスクリプトブロックを実行するには。

また、私にはより読みやすいと思われる簡単な構文は次のとおりです。作品

$cmd = @" 
&'$cmd' '$fn' 
"@ 
Invoke-Expression $cmd 
+0

。ありがとう、mjolinor。しかし、ここで何が起こっているのか説明できますか? "&"演算子は文字列をコマンドとして扱いますが、それはパラメータの二重引用符の2つのセットにどのように適用されますか? – Jason

+1

このように引用すると、明示的に呼び出す必要があります。それ以外の場合は、文字列として扱います。これは実際にはパラメータの単一引用符とは関係がありません。つまり、コマンド引数のパラメータをまとめて保持することです。 here-stringを使うだけで、エスケープや二重引用符の必要がなくなります。どんな種類の引用符を入れてもかまいません。 – mjolinor

+0

ありがとうございます。 – Jason

関連する問題