スペースと引用符を含むパラメーターを使用してPowerShellでEXEファイルを実行する方法


333

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 = "Data Source =。\ mydestsource; Integrated Security = false; User ID = sa; Pwd = sapass!; Database = mydb;"、computername = 10.10.10.10、username = administrator、password = adminpass "



あなたはlitteraly(私は、既存のPowerShellプロンプト内」を意味すると解釈)「PowerShellで」を意味する場合は、次の例では、easilytあなたのニーズに合ったadpatedすることができます注意してくださいそのパラメータからコマンドを分離する必要はありません: # Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
user3785010を

「ミニマークダウン」を使用して上記のコメントを編集し、コードの各行を別々の行に表示する方法がわかりません。元のコメントの編集に関する5分の制限時間が切れました。「mini-Markdown」を使用して問題を修正する方法がわかっている場合は、より読みやすい形式で再投稿します。1行目は次のようにする必要があります。#npm-check-updatesツールを使用して、グローバルにインストールされたnpmパッケージに対して利用可能な更新を表示
user3785010

回答:


347

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

PS> "Hello World"
Hello World

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

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

その後はおそらく、スペースや引用符を含むパラメータ/引数のペアのみを引用する必要があります。このようなEXEファイルを複雑なコマンドライン引数で呼び出す場合、PowerShellが引数をEXEファイルに送信する方法を示すツールを用意しておくと、通常は非常に役立ちます。PowerShellのコミュニティの拡張機能は、このようなツールを持っています。これは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解析モードについて」を参照してください。

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


1
2番目の例として使用すると、次のエラーが発生します。エラー:認識されない引数 '"-source:dbfullsql =" "" Data'。すべての引数は「-」で始まる必要があります。
Vans、

2
すみません、わかりません。現在、6人が回答に賛成しているので、明らかなものがないようですが、実際の回答は何ですか?PowerShellでスペースを含むパラメーターについて知っている特別なルールはありますか、それともEchoArgsを使用してケースバイケースでそれを行うことを提案していますか?
タイラーコリアー、

引数の引用は通常十分ですが、常にではありません。それが機能しない場合、を使用echoargsすると、PowerShellが引数をEXEに渡す前に引数を解釈する方法がわかります。
キース・ヒル

1
.batファイルでこれを行う方法を知っていますか?& 'C:\Program Files\Sublime Text 3\sublime_text.exe'コンソールで直接試してみましたが、バッチファイルでは「&は現時点では予期されていませんでした」というエラーが表示されます。
Joe Zim、2014年

気にしないで。見つけた:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Joe Zimが2014年

61

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

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

53

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

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

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

基本的にはAkiraの回答と同じですが、コマンドパラメーターを動的に作成して変数に入れれば、これは機能します。


2
これは最高です!base64なし、奇妙な-%構文、置換を切り替える構文、通常のPowerShell置換ルール、混乱なし、非常に読みやすい
AnneTheAgile

1
これは機能しません。パラメーターにパス名がある場合、パス名は複数のパラメーターに分割されます。
BrainSlugs83

1
素敵な答え。ただし、パラメーターの引用符で機能しますか?
山本明

他のすべてが実際に機能した後、これを試してください。また、Powershell拡張機能を使用するEchoArgs
Jeremy Thompson、

34

これは私のために働きました:

& '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は、この方法をよりシンプルにし、コマンドプロンプト構文と互換性を持たせる必要があります。


2
配列は間違いなく最良のオプションです-これは私にとってはうまくいきました。引数が動的だったので、配列変数を渡しました。ありがとう。
Jon Barker

私見最高のソリューション
Vasin Yuriy

25

それを行うために使用できるかなりの数の方法があります。

呼び出し演算子()、Invoke-Expressionコマンドレットなどを使用する方法は他にもありますが、安全ではないと見なされています。Start-Processの使用お勧めします。

方法1

簡単な例

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

あなたの場合

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-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"

このメソッドでは、コンマを使用してArgumentListのすべてのパラメーターを区切ります。

方法2

簡単な例

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

あなたの場合

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-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"

この方法は、パラメーターを一度に入力できるので簡単です。

PowerShellで文字列内の引用符( ")を表すには、アクサングラーブ(`)を挿入する必要があります(これはUSキーボードのTabキーの上にあるキーです)。

-NoNewWindow パラメーターは、現在のコンソールウィンドウに新しいプロセスを表示するために使用されます。既定では、Windows PowerShellは新しいウィンドウを開きます。

参照:Powershell / Scripting / Start-Process


シンプルが常に勝ちます!ありがとう。
Mike Casas

引用符のエスケープに関する最後のメモをありがとう!
パオロ


13

誰かが実行可能ファイルを実行する方法を知りたくない場合:

.....>。\ file.exe

または

......> full \ path \ to \ file.exe


2
これがその質問の答えになるはずです。「PowerShellからEXEを開始」キーワードで検索すると、これが求められます。ありがとうございました !
Jean-Daniel Gasser

2
引数付きで実行してみませんか?
SereneWizard

1
@SereneWizardさて、間にスペースを入れて.exeの後に追加してください。例:。\ file.exe param1 param2 param3
darkgaze

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接続文字列を作成する場合は、代替キー名を使用してください。たとえば、「ユーザーID」の代わりに「UID」、「データソース」の代わりに「サーバー」、「統合セキュリティ」の代わりに「Trusted_Connection」などを使用します。接続文字列からすべてのスペースを削除して初めて、それを機能させることができました。

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


2
私は他のすべての答えを試しましたが、これが私にとってうまくいった唯一の答えでした!この代替パスを提供していただきありがとうございます。
衆生

6

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

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

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

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

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>

6

以下を使用できます。

Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-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"

ヘルプガイドによると、ここで注意すべき重要な点は、FilePathが位置0にある必要があるということです。コマンドレットのヘルプガイドを呼び出すには、単にと入力しGet-Help <Commandlet-name> -Detailedます。この場合はGet-Help Start-Process -Detailedです。


5

私はすべての提案を試しましたが、msiexec.exeスペースを含むパラメーターで実行することはできませんでした。だから私の解決策は結局使用しましたSystem.Diagnostics.ProcessStartInfo

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()

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


1
これはopsの質問とは関係ありません。具体的には、Powershellの投稿で長いコマンドを実行する方法を尋ねました。ファイルパスにスペースを含むPowerShellスクリプトを実行する方法ではありません。
leinad13

質問のタイトルを読んでください。スペースは長さではなく問題です。これは、そのような問題に対する1つの有効な回答です。同じ問題が発生し、実際に試してみましたか?改善したい場合は、質問の実際のコマンドを含む編集内容を送信してください。
Tony Wall

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

3

exeファイルは、Powershellのさまざまな方法で実行できます。たとえば、unrar.exeを実行して.rarファイルを抽出する場合は、Powershellで次のように書くだけです。

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

しかし、これが機能しない場合があるため、上記のように&パラメーターを使用する必要があります。たとえば、vboxmanage.exe(virtualbox仮想マシンを管理するツール)では、引用符なしで、このような文字列の外側でパラメーターを呼び出す必要があります。

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

単にwinrarアーカイブファイルを.exeファイルとして呼び出す場合は、invoke-commandコマンドレットとSilentパラメーター/ Sを使用して解凍することもできます(圧縮された場所と同じフォルダーに自分自身を抽出します)。

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

したがって、Powershellで引数を指定して.exeファイルを実行する方法はいくつかあります。

時々、それを適切に動作させるための回避策を見つける必要があります。これは、.exeのコンパイル方法や作成者の作成方法によっては、さらに労力と労力が必要になる場合があります。


1

私はこのシンプルでクリーンで効果的な方法を使用しています。

引数を1行に1つずつ配列に配置します。これにより、読み取りと編集が非常に簡単になります。次に、すべての引数を二重引用符で囲んで1つの単一パラメーターを持つ関数に渡すという簡単なトリックを使用します。これにより、配列を含めてそれらが1つの文字列にフラット化され、PSの「Invoke-Expression」を使用して実行されます。このディレクティブは、文字列を実行可能なコマンドに変換するように特別に設計されています。うまく機能します:

                    # function with one argument will flatten 
                    # all passed-in entries into 1 single string line
Function Execute($command) {
                    # execute:
    Invoke-Expression $command;
                    # if you have trouble try:
  # Invoke-Expression "& $command";
                    # or if you need also output to a variable
  # Invoke-Expression $command | Tee-Object -Variable cmdOutput;

}

#  ... your main code here ...

               # The name of your executable app
$app = 'my_app.exe';
               # List of arguments:
               #    Notice the type of quotes - important !
               #    Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';

               # pass all arguments inside double quotes
Execute "$app $args";

1

私のラップトップでは、次のコードが完全に機能していました。

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

次に、1つのサーバーで直接実行しようとすると、これらのエラーが発生し始めました "Unrecognized argument ...etc.... All arguments must begin with "-". "

考えられるすべての回避策を試したところ(成功しませんでした)、サーバー(Windows 2008 R2)のPowershellがバージョン3.0であるのに、私のラップトップには5.0があることがわかりました。(「$ PSVersionTable」を使用してバージョンを確認できます)。

Powershellを最新バージョンにアップグレードした後、再び動作し始めました。


1

Cmdは引用符で囲まれたexeの実行を処理できますが、Powershellは処理できません。exeファイル自体がないので、exeファイル自体の実行に対処します。文字通り、二重引用符を外部コマンドの引数に送信する必要がある場合、それは別の場所で取り上げられている別の問題です。

1)exeフォルダーをパスに追加します。

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy

2)スペースを逆引用符で囲みます。

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe

0

したがって、私は同様の問題に遭遇し、代わりにこの方法で解決することを選択しました:

  1. 引用符( ")文字をバックティック(`)でエスケープする
  2. 新しい式を引用符( ")で囲みます
  3. 呼び出し演算子(&)を使用しinvoke-expressionて、新しい文字列に対してコマンドを発行します

ソリューションの例:

&{invoke-expression "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` ""}


0

実行可能ファイル名については、new-aliasコマンドレットを使用して、スペースの処理を回避したり、$ PATH環境に実行可能ファイルを追加する必要をなくしたりできます。

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

PSエイリアスをリストまたは変更するには、以下も参照してください。

PS> get-alias
PS> set-alias

ジェフリー・ヒックスの記事から

他の答えは議論に対処します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.