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 meneruskanINSTALLLOCATION='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+
iefungsi pembantu dariNativemodul (di PSv5+, instal denganInstall-Module Nativedari Galeri PowerShell ), yang secara internal mengkompensasi semua perilaku yang rusak dan memungkinkan melewati argumen seperti yang diharapkan; yaitu, cukup tambahkanieke 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 , gunakanStart-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.
- gunakan
-
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
.