8

リモートマシンで展開を実行するための汎用のPowerShellスクリプトを作成しています。オーバーランできない1つの問題が発生しました。この問題は、ArgumentListによって渡されたScriptblock内の二重引用符を含むパラメーターにあります。

私はこのようなものを持っています:

$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
}

$deploymentPackagesに二重引用符を追加しました。それでも、コマンドは次のようにリモートで実行されます(もちろん失敗します)。

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

適切な実行パスは次のようになります。

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

パッケージの周りに引用符なし-1つ-everythigを台無しにする外部

私は多くのソリューションをテストしましたが、どれも機能しなかったため、この問題をオーバーランする方法。

よろしくお願いします!

4

5 に答える 5

8

これを修正するには、一重引用符を使用して文字列をラップします。一重引用符を使用すると、引用符の間の内容は変更されません(変数は拡張されず、引用符のような記号は保持されます)。例えば

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

deploymentpackagesしたがって、スクリプトを修正するには、配列を次のように置き換えてみてください。

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"')
于 2013-02-20T21:21:35.700 に答える
6

あなたはこのようなことをすることができます

$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
}

これは、実行可能ファイルに渡されるときに1つの引数にバンドルされます。これは、 cmd.exe-package:<some string here>のように実行するのと同じです。-package:"aaa bbb ccc"

リテラルの引用符をexeに渡したくないと思います。-package:<some string here>スペースに関係なく、単一の引数にするためです。<some string here>

リテラル引用符をexeに渡す場合は、上記のコードを次のように使用します。

& $deployCmd "-package:`"$deployPackage`"" -action:doit
于 2013-02-20T20:54:02.603 に答える
2

文字列を二重引用符で囲んで一重引用符を使用してみてください。スクリプトを少し簡略化して、文字列を実行する代わりに文字列を記述するようにしました。

$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;
}
于 2013-02-20T21:19:57.950 に答える
1

を使用し"""ます。例えば、

$Var = "One"

$Varが表示されますOne

"""$Var"""表示されますがOne

于 2015-12-07T16:08:26.937 に答える
1

DOSスクリプトから呼び出されたPowerShellスクリプトから電子メールを送信しようとしたときに、同じ問題が発生しました。私は次の解決策を見つけるために少し時間を失いました。

DOSスクリプト

set MSG="US-TrackingFile has been copied to Z: drive"
call SendMail.bat %MSG%

SendMail.batDOSスクリプト

PowerShell.exe .\SendMail.ps1 '"%1"'

SendMail.ps1PowerShellスクリプト

$msg = $args[0]

Send-MailMessage
  -to "bernard_schleich@atos.net" 
  -subject "$msg" 
  -smtpserver emearelay.ec.company.com 
  -from "windows.system@company.com" 

中間DOSスクリプトを呼び出さない次のソリューションも機能します

set MSG="\"US-TrackingFile has been copied to Z: drive\""
PowerShell.exe .\SendMail.ps1 %MSG%

ただし、各メッセージの最初と最後に\ "を追加する必要があるため、少し注意が必要です。

すべての場合において、私のメッセージのタイトルは、メッセージの開始時と終了時に二重引用符なしで正しく表示されます:-)

于 2018-05-18T10:07:58.693 に答える