2013-02-20 6 views
5

リモートマシンへの展開を実行するための一般的なpowershellスクリプトを作成しています。私はオーバーランすることができない一つの問題を直撃しているが、この問題は、私はこのような何か持ってArgumentListは二重引用符で囲まれたパラメータは、ArgumentListによってScriptblockに正しく​​渡されません。

によって渡されたスクリプトブロック内の二重引用符を持つパラメータである:私は$ deploymentPackagesに二重引用符を追加した

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @(`"“package - one - external"`", `"“package - two - external"`", `"“package - three - internal"`") 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) & $deployCmd -package:$deployPackage -action:doit } -ArgumentList $deploymentCommand,$deploymentPackage 
} 

を。適切な実行パスがあるべき

D:\some path\Command.exe -package:package - one - external -action:doit 
D:\some path\Command.exe -package:package - two - external -action:doit 
D:\some path\Command.exe -package:package - three - external -action:doit 

ながら::そして、まだ私は私のコマンドが(もちろん失敗した)このようremotly実行さそうだ

D:\some path\Command.exe -package:"package - three - external" -action:doit 

パッケージの周りに引用符なし - 1 - これは混乱外部up everythig

私はいくつかのソリューションをテストし、そのうちのどれもうまくいきませんでしたので、この問題をどのように克服するか。

ありがとうございました!

答えて

5

あなたはこの

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @('package - one - external', 'package - two - external', 'package - three - internal') 
$remoteScript = { 
    param($deployCmd, $deployPackage) 
    & $deployCmd "-package:$deployPackage" -action:doit 
} 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock $remoteScript -ArgumentList $deploymentCommand,$deploymentPackage 
} 

cmd.exeの中-package:"aaa bbb ccc"のようなものをやってと同じである実行可能、に渡されたとき、これは、単一の引数に-package:<some string here>を束ねるような何かを行うことができます。

は、私はあなたが上記の使用、リテラル引用符をexeファイルに渡すことにしたい場合は<some string here>

にかかわらず、スペースの単一の引数をするだけ-package:<some string here>ため、exeファイルに渡されたリテラル引用符をしたくないと仮定します

& $deployCmd "-package:`"$deployPackage`"" -action:doit 
+0

を表示しますが。ありがとう! – Midi

1

文字列の前後に一重引用符を使用してください。スクリプトを単純化して、実行する代わりに文字列を書くだけでした。

$remoteAddress = "some-pc"; 
$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"'); 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock { 
     param ($deploymentPackage) write-host ("-package:{0} -action:doit" -f $deploymentPackage); 
    } -ArgumentList $deploymentPackage; 
} 
8

これを修正するには、シングルクォーテーションを使用して文字列をラップします。一重引用符を使用すると、引用符間の内容は変更されません(変数は展開されず、引用符のような記号も保持されます)。例えば。だからあなたのスクリプトを修正する

PS > '"this is a test"' 
"this is a test" 

、これであなたのdeploymentpackages配列を交換してください:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"') 
1

使用"""。例えば、

$Var = "One" 

$VarOneが表示されます。

"""$Var"""は、このソリューションは、完全に働いたOne

関連する問題