ऐसा लगता है कि एम्बेडेड स्पेस के साथ पथ पास करने के लिए करने के लिए msiexec
, आपको स्पष्ट एम्बेडेड . का उपयोग करना चाहिए "..."
उनके इर्द-गिर्द उद्धृत करना।
आपके मामले में, इसका मतलब है कि पास करने के बजायINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
, आपको INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
पास करना होगा
एम्बेडेड "..."
. पर ध्यान दें और अतिरिक्त \
पथ के अंत में यह सुनिश्चित करने के लिए कि \"
केवल एक बच निकला . के लिए गलत नहीं है "
द्वारा msiexec
(हालांकि यह अतिरिक्त \
. के बिना काम कर सकता है भी)।
यह सब एक साथ रखने के लिए:
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'
चेतावनी :
-
यह एम्बेडेड-उद्धरण तकनीक लंबे समय तक टिकी हुई है, लेकिन टूटी पावरशेल व्यवहार - देखें यह जवाब ; क्या इसे कभी ठीक किया जाना चाहिए, तकनीक काम करना बंद कर देगी; इसके विपरीत,
--%
नीचे दिखाया गया तरीका काम करना जारी रखेगा। -
PSv3+
ie
. का उपयोग करना एक वैकल्पिक समाधान-मुक्त, भविष्य-सबूत तरीका है सहायक कार्यNative
से मॉड्यूल (PSv5+ में,Install-Module Native
के साथ इंस्टॉल करें पॉवरशेल गैलरी से ), जो आंतरिक रूप से सभी टूटे हुए व्यवहार की भरपाई करता है और अपेक्षित तर्कों को पारित करने की अनुमति देता है; यानी, केवलie
. को पहले से तैयार करना आपके मूल आदेश के लिए पर्याप्त होगा:
# 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'
विकल्प मूल उद्धरण के साथ रहना है और --%
. का उपयोग करना है , स्टॉप-पार्सिंग सिंबल , लेकिन ध्यान दें कि इसका मतलब है कि आप बाद के सभी तर्कों में PowerShell चर का उपयोग नहीं कर सकते हैं:
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'
ध्यान दें कि msiexec
, CLI (कमांड-लाइन इंटरफ़ेस) होने के बावजूद, एक GUI . है -सबसिस्टम एप्लिकेशन, इसलिए यह एसिंक्रोनस रूप से चलता है डिफ़ॉल्ट रूप से; अगर आप चाहते हैं कि इसे सिंक्रोनस रूप से चलाएं , उपयोग करें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.
ध्यान दें कि तर्क-सूची स्ट्रिंग, $msiArgs
, प्रयोग किया जाता है जैसा है Start-Process
. द्वारा लक्ष्य प्रोग्राम (msiexec
.) को लागू करने के लिए प्रयुक्त कमांड लाइन के भाग के रूप में ), जिसका अर्थ है:
-
केवल (एम्बेडेड) दोहरा-उद्धरण इस्तेमाल किया जाना चाहिए।
"..."
का उपयोग करें एम्बेडेड"
. के साथ`"
. के रूप में बच निकला स्ट्रिंग में पावरशेल वैरिएबल और एक्सप्रेशन एम्बेड करने के लिए।
-
इसके विपरीत, हालांकि, आंशिक रूप से उद्धृत तर्कों के लिए किसी वैकल्पिक हल की आवश्यकता नहीं है।
भले ही Start-Process
तकनीकी रूप से तर्कों को व्यक्तिगत रूप से पारित करने का समर्थन करता है , एक सरणी . के रूप में , लंबे समय से चली आ रही बग के कारण इससे बचा जा सकता है - देखें GitHub समस्या #5576
।