sql >> データベース >  >> NoSQL >> MongoDB

このmsiexec.exeコマンドがPowerShellで機能しないのはなぜですか?

    スペースが埋め込まれたパスを渡すために 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 を参照してください 。




    1. MongoDbはクエリC#ドライバーと区別されます

    2. Mongoose&Express:参照データを適切に削除、作成、保存する方法

    3. プロパティをRedisストアのsocket.ioオブジェクトに関連付ける方法は?

    4. MongoJSONドキュメント->JSON->BSON