MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tại sao lệnh msiexec.exe này không hoạt động trong powershell?

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ằng Install-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ước ie 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.
  • 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 .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để sắp xếp và giới hạn kết quả trong mongodb?

  2. tìm kiếm văn bản mongodb với nhiều trường

  3. Làm cách nào để lưu trữ các phiên trong MongoDB từ NodeJS?

  4. Làm cách nào để viết hàm-y chấp nhận tham số-fct_x truy cập vào var-a được yêu cầu xác định trong hàm-y?

  5. Cách lấy dữ liệu Mongo bằng MongoDB phiên bản 3.0 tổng hợp