MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mengapa perintah msiexec.exe ini tidak berfungsi di PowerShell?

Tampaknya untuk melewati jalur dengan spasi tertanam ke msiexec , Anda harus menggunakan tersemat explicit eksplisit "..." mengutip di sekitar mereka.

Dalam kasus Anda, ini berarti bahwa alih-alih meneruskan
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , Anda harus melewati INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Perhatikan "..." . yang disematkan dan tambahan \ di akhir jalur untuk memastikan bahwa \" saja tidak salah untuk melarikan diri " oleh msiexec (meskipun mungkin berfungsi tanpa \ extra tambahan juga).

Untuk menyatukan semuanya:

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'

Peringatan :

  • Teknik kutipan tertanam ini rbergantung pada lama, tetapi rusak Perilaku PowerShell - lihat jawaban ini ; jika itu pernah diperbaiki, tekniknya akan berhenti bekerja; sebaliknya,
    --% pendekatan yang ditunjukkan di bawah ini akan terus berfungsi.

  • Metode yang bebas solusi dan tahan masa depan adalah dengan menggunakan PSv3+ ie fungsi pembantu dari Native modul (di PSv5+, instal dengan Install-Module Native dari Galeri PowerShell ), yang secara internal mengkompensasi semua perilaku yang rusak dan memungkinkan melewati argumen seperti yang diharapkan; yaitu, cukup tambahkan ie ke perintah asli Anda sudah cukup:

# 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'

Alternatif adalah tetap menggunakan kutipan asli dan menggunakan --% , simbol stop-parsing , tetapi perhatikan bahwa ini berarti Anda tidak dapat menggunakan variabel PowerShell di semua argumen berikutnya:

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'

Perhatikan bahwa msiexec , meskipun memiliki CLI (antarmuka baris perintah), adalah GUI -aplikasi subsistem, sehingga berjalan secara tidak sinkron secara default; jika Anda ingin menjalankannya secara serempak , gunakan
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.

Perhatikan bahwa string daftar argumen, $msiArgs , digunakan apa adanya oleh Start-Process sebagai bagian dari baris perintah yang digunakan untuk menjalankan program target (msiexec ), yang artinya:

  • hanya (tertanam) kutipan ganda harus digunakan.

    • gunakan "..." dengan " . yang disematkan lolos sebagai `" untuk menyematkan variabel dan ekspresi PowerShell dalam string.
  • sebaliknya, bagaimanapun, tidak diperlukan solusi untuk argumen yang dikutip sebagian.

Meskipun Start-Process secara teknis mendukung penyampaian argumen secara individual , sebagai array , ini sebaiknya dihindari karena bug yang sudah berlangsung lama - lihat Masalah GitHub #5576 .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. kafka connector debezium mongodb CDC update/$set message tanpa filter(_id value)

  2. Birt mongodb param

  3. Perbedaan antara bidang id dan _id di MongoDB

  4. Cara untuk menurunkan penggunaan memori oleh luwak saat melakukan kueri

  5. Jalankan pengurangan peta untuk semua kunci dalam koleksi - mongodb