418

PowerShellで次のコマンドをどのように実行しますか?

C:\ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb:sync -source:dbfullsql = "Data Source = mysource; Integrated Security = false; User ID = sa; Pwd = sapass!; Database = mydb;" -dest:dbfullsql = "DataSource=。\mydestsource;Integrated Security = false; User ID = sa; Pwd = sapass!; Database = mydb;"、computername = 10.10.10.10、username = administrator、password = adminpass "

4

21 に答える 21

418

PowerShell は、文字列で始まるコマンドを検出すると、文字列を評価するだけです。つまり、通常は、次のように画面にエコーします。

PS> "Hello World"
Hello World

PowerShell で文字列をコマンド名として解釈する場合は、次のように呼び出し演算子 (&) を使用します。

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

その後、スペースや引用文字を含むパラメーター/引数のペアを引用するだけで済みます。複雑なコマンド ライン引数を使用してこのような EXE ファイルを呼び出す場合、通常、PowerShell が引数を EXE ファイルに送信する方法を示すツールがあると非常に役立ちます。PowerShell Community Extensionsには、そのようなツールがあります。これは、echoargs と呼ばれます。EXE ファイルを echoargs に置き換えるだけで、すべての引数をそのままにすると、EXE ファイルが引数を受け取る方法が表示されます。次に例を示します。

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

echoargs を使用すると、正しくなるまで実験できます。次に例を示します。

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

以前は、接続文字列を二重引用符で囲むのに苦労していたことがわかりました。cmd.exe でさえそれらを削除するため、明らかにそれは必要ありません。

ところで、PowerShell チームには脱帽です。内部の二重引用符をそのままにしておく必要がある場合、望ましい結果を得るために一重引用符と二重引用符の特定の呪文を示すのに非常に役立ちました。:-) 彼らはまた、これが苦痛の領域であることを認識していますが、特定の問題によって影響を受ける人々の数に突き動かされています。これがあなたにとって苦痛な領域である場合は、このPowerShell バグ送信に投票してください。

PowerShell の解析方法の詳細については、私の効果的な PowerShell ブログ シリーズ、特に項目 10「PowerShell 解析モードについて」を参照してください。

2012 年 4 月 4 日更新: この状況は、PowerShell V3 での処理がはるかに簡単になります。詳細については、このブログ投稿を参照してください

于 2009-11-04T16:23:57.077 に答える
76

.exe 名の前に&演算子を追加するだけです。SQL Server Express をサイレント モードでインストールするコマンドを次に示します。

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE
于 2011-01-10T13:24:30.690 に答える
75

コマンドとパラメーターの両方にスペースがありましたが、これがうまくいきました:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

基本的にはアキラの答えと同じですが、コマンドパラメーターを動的に構築して変数に入れると機能します。

于 2014-03-07T10:22:42.583 に答える
42

これは私のために働いた:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

パスまたは接続文字列を 1 つの配列項目に入れ、他のものをそれぞれ 1 つの配列項目に分割するだけです。

ここには他にも多くのオプションがあります: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft は、この方法をよりシンプルにし、コマンド プロンプト構文と互換性を持たせる必要があります。

于 2013-11-28T17:43:07.827 に答える
22

このページを参照してください: https://slai.github.io/posts/powershell-and-external-commands-done-right/

外部実行可能ファイルとして vshadow を使用したまとめ:

$exe = "H:\backup\scripts\vshadow.exe"
&$exe -p -script=H:\backup\scripts\vss.cmd E: M: P:
于 2012-09-10T18:44:18.073 に答える
9

次のアプローチを使用して、同様のコマンドを機能させることができました。

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

コマンドの場合 (現在はあまり役に立ちません)、次のようになります。

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

重要なポイントは次のとおりです。

  • ソース引数を引用符で囲み、接続文字列を囲む埋め込み引用符を削除します
  • スペースを含まない SQL 接続文字列を作成する際に、代替キー名を使用します。たとえば、「User Id」の代わりに「UID」、「Data Source」の代わりに「Server」、「Integrated Security」の代わりに「Trusted_Connection」などを使用します。接続文字列からすべてのスペースを削除した場合にのみ、機能させることができました。

コマンドラインの最後に「コンピューター名」の部分を追加しようとはしませんでしたが、この情報が、これを読んでいる他の人が望ましい結果に近づくのに役立つことを願っています.

于 2011-01-11T17:07:50.370 に答える
8

新しいV3言語機能から引用されたPowerShellV3の新しいエスケープ文字列:

Cmd.exeからのコマンドラインのより簡単な再利用

Webには、Cmd.exe用に作成されたコマンドラインがたくさんあります。これらのコマンド行はPowerShellで十分に機能しますが、セミコロン(;)、ドル記号($)、中括弧などの特定の文字が含まれている場合は、変更を加えて、引用符を追加する必要があります。これが多くの軽微な頭痛の原因であるように思われました。

このシナリオに対処するために、コマンドラインの解析を「エスケープ」する新しい方法を追加しました。魔法のパラメータ-%を使用すると、コマンドラインの通常の解析が停止され、はるかに単純なものに切り替わります。引用符は一致しません。セミコロンにとどまりません。PowerShell変数は展開しません。Cmd.exe構文(%TEMP%など)を使用する場合は、環境変数を展開します。それ以外は、行末(または配管の場合は配管)までの引数はそのまま渡されます。次に例を示します。

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>
于 2012-12-07T20:34:53.497 に答える
3

これは私のために働いた:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

重要なのは、コマンド全体が外側の引用符で囲まれているようです。「&」アンパサンドを使用して別の子コマンド ファイルが実行されていることを指定し、最後にパス/ファイル名をスペースで囲む (ダブルダブル) 引用符をエスケープします。そもそも実行したかったのです。

これは、-File がゼロ以外のリターン コードを返さず、-Command が唯一の代替手段であるという MS 接続の問題に対する唯一の回避策も完了しています。しかし、これまで -Command の制限は、スペースがサポートされていないことだと考えられていました。そのフィードバック項目も更新しました。

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option

于 2014-05-27T11:06:23.183 に答える
3

別の答えは、Base64でエンコードされたコマンド スイッチを使用することです。

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

デコードすると、すべての引数と二重引用符が保持された OP の元のスニペットであることがわかります。

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

元のコマンド:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

Base64 でエンコードすると、次のようになります。

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

自宅で複製する方法は次のとおりです。

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip
于 2014-07-28T14:49:34.813 に答える