リモートコンピュータで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'
"@)
。ありがとう、mjolinor。しかし、ここで何が起こっているのか説明できますか? "&"演算子は文字列をコマンドとして扱いますが、それはパラメータの二重引用符の2つのセットにどのように適用されますか? – Jason
このように引用すると、明示的に呼び出す必要があります。それ以外の場合は、文字列として扱います。これは実際にはパラメータの単一引用符とは関係がありません。つまり、コマンド引数のパラメータをまとめて保持することです。 here-stringを使うだけで、エスケープや二重引用符の必要がなくなります。どんな種類の引用符を入れてもかまいません。 – mjolinor
ありがとうございます。 – Jason