Có vẻ như để vượt qua các đường dẫn có không gian nhúng thành msiexec
, bạn phải sử dụng nhúng rõ ràng "..."
trích dẫn xung quanh chúng.
Trong trường hợp của bạn, điều này có nghĩa là thay vì truyền
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
, bạn phải chuyển INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Lưu ý "..."
được nhúng và \
bổ sung ở cuối đường dẫn để đảm bảo rằng \"
một mình không bị nhầm với một người đã trốn thoát "
bởi msiexec
(mặc dù nó có thể hoạt động mà không có \
bổ sung quá).
Để tổng hợp tất cả lại với nhau:
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'
Báo trước :
-
Kỹ thuật trích dẫn nhúng này đã tồn tại lâu dài, nhưng bị hỏng Hành vi PowerShell - xem câu trả lời này ; nếu nó được sửa, kỹ thuật sẽ ngừng hoạt động; ngược lại,
--%
phương pháp hiển thị bên dưới sẽ tiếp tục hoạt động. -
Một phương pháp không có giải pháp thay thế, có khả năng chống lại tương lai là sử dụng PSv3 +
ie
chức năng trợ giúp từNative
mô-đun (trong PSv5 +, cài đặt bằngInstall-Module Native
từ Thư viện PowerShell ), nội bộ bù đắp cho tất cả các hành vi bị hỏng và cho phép truyền các đối số như mong đợi; nghĩa là, chỉ cần viết trướcie
với lệnh ban đầu của bạn là đủ:
# 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'
Thay thế là tuân theo trích dẫn gốc và sử dụng --%
, biểu tượng phân tích cú pháp dừng , nhưng lưu ý rằng điều này có nghĩa là bạn không thể sử dụng các biến PowerShell trong tất cả các đối số tiếp theo:
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'
Lưu ý rằng msiexec
, mặc dù có CLI (giao diện dòng lệnh), là một GUI -Ứng dụng hệ thống phụ, vì vậy nó chạy không đồng bộ theo mặc định ; nếu bạn muốn chạy nó đồng bộ , sử dụng
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.
Lưu ý rằng chuỗi đối số-danh sách, $msiArgs
, được sử dụng nguyên trạng bởi Start-Process
như một phần của dòng lệnh được sử dụng để gọi chương trình đích (msiexec
), có nghĩa là:
-
chỉ (được nhúng) trích dẫn kép phải được sử dụng.
- sử dụng
"..."
với"
được nhúng đã thoát dưới dạng`"
để nhúng các biến và biểu thức PowerShell vào chuỗi.
- sử dụng
-
ngược lại, không cần giải pháp thay thế cho các đối số được trích dẫn một phần.
Mặc dù Start-Process
về mặt kỹ thuật hỗ trợ truyền các đối số riêng lẻ , dưới dạng một mảng , điều này tốt nhất nên tránh do một lỗi lâu dài - hãy xem Sự cố GitHub # 5576
.