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+
ie
fungsi pembantu dariNative
modul (di PSv5+, instal denganInstall-Module Native
dari Galeri PowerShell ), yang secara internal mengkompensasi semua perilaku yang rusak dan memungkinkan melewati argumen seperti yang diharapkan; yaitu, cukup tambahkanie
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 , 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
.