スペースが埋め込まれたパスを渡すために msiexec
へ 、明示的な埋め込みを使用する必要があります "..."
それらの周りを引用します。
あなたの場合、これは、
INSTALLLOCATION ='C:\ Program Files \ MongoDB \ Server \ 3.4\'
を渡す代わりに 、 INSTALLLOCATION ='"C:\ Program Files \ MongoDB \ Server \ 3.4 \\"'
を渡す必要があります
埋め込まれた"..."
に注意してください および追加の\
パスの最後にあることを確認して、 \ "
一人でエスケープと間違えられることはありません "コード>
msiexec
による (ただし、追加の \
がなくても機能する場合があります。
すべてをまとめるには:
msiexec.exe /q /i `
'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' `
INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"' ADDLOCAL='all'
警告 :
-
この埋め込み引用手法は、長年の信頼に基づいていますが、壊れています PowerShellの動作 -この回答 をご覧ください;修正された場合、テクニックは機能しなくなります。対照的に、
-%
以下に示すアプローチは引き続き機能します。 -
回避策のない、将来を見据えた方法は、 PSv3 +
ie
を使用することです。 ヘルパー関数ネイティブ
から モジュール (PSv5 +では、Install-Module Native
を使用してインストールします PowerShellGallery から )、これは内部的にすべての壊れた動作を補正します 期待どおりに引数を渡すことができます。つまり、単にie
を先頭に追加します 元のコマンドに十分です:
# No workarounds needed with the 'ie' function from the 'Native' module.
ie msiexec.exe /q /i 'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' ADDLOCAL='all'
代替 元の引用符に固執し、-%
を使用することです 、解析停止記号> 、ただし、これは、後続のすべての引数でPowerShell変数を使用できないことを意味することに注意してください。
msiexec.exe /q /i `
'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' `
--% INSTALLLOCATION="C:\Program Files\MongoDB\Server\3.4\\" ADDLOCAL='all'
msiexec
に注意してください 、CLI(コマンドラインインターフェイス)があるにもかかわらず、 GUI -サブシステムアプリケーション。非同期で実行されます デフォルト; 同期して実行したい場合 、
Start-Process -Wait
を使用します :
$msiArgs = '/q /i "C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi" INSTALLLOCATION="C:\Program Files\MongoDB\Server\3.4\\" ADDLOCAL=all'
$ps = Start-Process -PassThru -Wait msiexec -ArgumentList $msiArgs
# $ps.ExitCode contains msiexec's exit code.
引数リストの文字列$msiArgs
に注意してください。 、現状のまま使用されます Start-Process
による ターゲットプログラム( msiexec
を呼び出すために使用されるコマンドラインの一部として )、つまり:
-
のみ(埋め込み)二重引用符 使用する必要があります。
-
"..."
を使用します"
が埋め込まれています`"
としてエスケープ PowerShell変数と式を文字列に埋め込みます。
-
-
ただし、逆に、部分的に引用された引数の回避策は必要ありません。
Start-Process
であっても 技術的に引数の受け渡しを個別にサポートします 、配列として 、これは長年のバグのために回避するのが最善です- GitHub issue#5576
を参照してください 。