eplawless का स्वयं का उत्तर बस और प्रभावी ढंग से उसकी विशिष्ट समस्या को हल करता है: यह "
संपूर्ण तर्क सूची में सभी उदाहरणों को प्रतिस्थापित करता है \"
, जिसके लिए बैश को दोहरे-उद्धरण वाले स्ट्रिंग के अंदर दोहरे-उद्धरण की आवश्यकता होती है।
आमतौर पर इस सवाल का जवाब देने के लिए कि डबल-कोटेड स्ट्रिंग के अंदर डबल-कोट से बचने के लिएcmd.exe
, विंडोज कमांड-लाइन दुभाषिया (चाहे कमांड लाइन पर - अक्सर अभी भी गलती से "डॉस प्रॉम्प्ट" कहा जाता है - या एक बैच फ़ाइल में): PowerShell पर एक नज़र के लिए नीचे देखें ।
टीएल; डीआर :
आपको एक (nother) बैच फ़ाइल को एक स्ट्रिंग पास करते समय उपयोग करना चाहिए""
और आप Microsoft के C / C ++ /। NET कंपाइलर (जो भी स्वीकार करते हैं ) के साथ बनाए गए अनुप्रयोगों के साथ उपयोग कर सकते हैं , जिसमें विंडोज पर पायथन और Node.js शामिल हैं :""
\"
\"
है आवश्यक - एकमात्र विकल्प के रूप में - कई अन्य कार्यक्रमों के द्वारा , (! जैसे, रूबी, पर्ल, और यहां तक कि Microsoft के अपने विंडोज PowerShell ()), लेकिन इसके उपयोग नहीं है सुरक्षित :
\"
Windows PowerShell सहित कई निष्पादन योग्य और दुभाषियों की आवश्यकता होती है - जब बाहर से तार पास होते हैं - या, Microsoft के संकलक ""
के मामले में , विकल्प के रूप में समर्थन - अंततः, हालांकि, यह तर्क सूची को पार्स करने के लिए लक्ष्य कार्यक्रम पर निर्भर है। ।
- उदाहरण:
foo.exe "We had 3\" of rain."
- कैसे, उपयोग किए जाने वाले
\"
नियमों का उपयोग कर सकते हैं, कमानों और / या बाहर / पुनर्निर्देशन कार्यों की मध्यस्थता :
- निम्नलिखित चरित्र इस जोखिम को प्रस्तुत करते हैं:
& | < >
- उदाहरण के लिए,
ver
कमांड के अनपेक्षित निष्पादन में निम्नलिखित परिणाम ; स्पष्टीकरण के लिए नीचे देखें और वर्कअराउंड के लिए अगली बुलेट बिंदु:
foo.exe "3\" of snow" "& ver."
- के लिए विंडोज PowerShell ,
\""
और "^""
मजबूत होते हैं, लेकिन सीमित विकल्प (नीचे अनुभाग देखें "PowerShell के CLI रही है ...")।
यदि आप उपयोग करना चाहते हैं \"
, तो केवल 3 सुरक्षित दृष्टिकोण हैं , जो हालांकि काफी बोझिल हैं : टीएस टू हैट टू टीएस उसकी मदद के लिए।
अपनी बैच फ़ाइल में (संभवतः चयनात्मक ) विलंबित चर विस्तार का उपयोग करते हुए , आप शाब्दिक रूप \"
से एक चर और संदर्भ में संग्रह"..."
!var!
कर सकते हैं जो वाक्यविन्यास का उपयोग करके स्ट्रिंग के अंदर चर - टीएस के सहायक उत्तर को देखें ।
- उपर्युक्त दृष्टिकोण, बोझिल होने के बावजूद, इसका लाभ है कि आप इसे व्यवस्थित रूप से लागू कर सकते हैं और यह किसी भी इनपुट के साथ मजबूती से काम करता है ।
केवल LITERAL स्ट्रिंग्स के साथ - जो VARIABLES को शामिल नहीं करते हैं - क्या आपको एक समान तरीके से दृष्टिकोण मिलता है: स्पष्ट ^
रूप से सभी मेटाचैकर्स को हटा देंcmd.exe
: " & | < >
और - यदि आप भी वैरिएबल विस्तार को दबाना चाहते हैं - %
:
foo.exe ^"3\^" of snow^" ^"^& ver.^"
अन्यथा, आपको यह पहचानने के आधार पर अपनी स्ट्रिंग तैयारcmd.exe
\"
करनी होगी कि स्ट्रिंग के कुछ हिस्सों को गलत माना जाता है क्योंकि गलत चित्रण के कारण गलत समझा जाता है:
में शाब्दिक खोल अक्षरों से परे युक्त अंश: ^
उन्हें -escape; ऊपर दिए गए उदाहरण का उपयोग करते हुए, यह है &
कि-सुरक्षित होना चाहिए ^
:
foo.exe "3\" of snow" "^& ver."
-स्टाइल चर संदर्भ के साथ%...%
भागों में : सुनिश्चित करें कि cmd.exe
उन्हें एक "..."
स्ट्रिंग का हिस्सा मानता है और यह कि चर मानों में स्वयं एम्बेडेड, असंतुलित उद्धरण नहीं हैं - जो हमेशा संभव भी नहीं होता है ।
पृष्ठभूमि की जानकारी के लिए, पर पढ़ें।
पृष्ठभूमि
नोट: यह मेरे अपने प्रयोगों पर आधारित है। अगर मैं गलत हूं तो मुझे बताएं।
POSIX- जैसे गोले जैसे कि बैश ऑन यूनिक्स जैसी प्रणालियां , टार्गेट लिस्ट (स्ट्रिंग) को टार्गेट से अलग करती हैं, व्यक्तिगत रूप से टार्गेट प्रोग्राम को पास करने से पहले : अन्य एक्सपैंशन के बीच, वे आर्ग्युमेंट लिस्ट को अलग-अलग शब्दों में विभाजित करते हैं (शब्द विभाजन) और से क्विटिंग कैरेक्टर को हटाते हैं परिणामी शब्द (उद्धरण हटाने)। टारगेट प्रोग्राम को अलग-अलग तर्कों का एक सरणी दिया जाता है , जिसमें सिंटैक्टिक उद्धरण हटा दिए जाते हैं ।
इसके विपरीत, विंडोज कमांड दुभाषिया स्पष्ट रूप से तर्क सूची को टोकन नहीं करता है और बस सभी तर्कों को शामिल करते हुए एकल स्ट्रिंग पास करता है - जिसमें चार्टिंग उद्धरण शामिल हैं। - लक्ष्य कार्यक्रम के लिए।
हालांकि, कुछ प्रीप्रोसेसिंग एकल स्ट्रिंग से पहले लक्षित कार्यक्रम में पारित होने से पहले होती है: ^
एस्केप चर। डबल-उद्धृत स्ट्रिंग्स को बाहर निकाल दिया जाता है (वे निम्नलिखित वर्ण से बच जाते हैं।), और चर संदर्भ (जैसे, %USERNAME%
) पहले प्रक्षेपित होते हैं ।
इस प्रकार, यूनिक्स के विपरीत, यह तर्क को पार्स करने के लिए टार्गेट प्रोग्राम को पार्स करने और उद्धरण चिह्नों के साथ अलग-अलग तर्कों में इसे तोड़ने की जिम्मेदारी है। इस प्रकार, अलग-अलग कार्यक्रमों के लिए अलग-अलग भागने के तरीकों की आवश्यकता हो सकती है और सभी कार्यक्रमों के साथ काम करने की गारंटी देने वाला कोई एकल भागने वाला तंत्र नहीं है - https://stackoverflow.com/a/4094897/45375 में अराजकता पर उत्कृष्ट पृष्ठभूमि है जिसमें विंडोज कमांड-लाइन है पार्स करने।
\"
जैसा कि ऊपर उल्लेख किया गया है , व्यवहार में, बहुत आम है, लेकिन सुरक्षित नहीं है:
चूंकि cmd.exe
खुद \"
को एक बची हुई डबल-कोट के रूप में पहचान नहीं है , इसलिए यह बाद में कमांड लाइन पर टोकन को गलत तरीके से हटा सकता है और संभावित रूप से उन्हें कमांड और / या इनपुट / आउटपुट पुनर्निर्देशन के रूप में व्याख्या कर सकता है ।
संक्षेप में: समस्या सतहों, अगर निम्न वर्णों में से किसी एक का पालन करें खोलने या असंतुलित \"
:& | < >
; उदाहरण के लिए:
foo.exe "3\" of snow" "& ver."
cmd.exe
निम्नलिखित टोकन को देखता है, जिसके परिणामस्वरूप \"
एक नियमित डबल-उद्धरण के रूप में गलत व्याख्या की जाती है:
"3\"
of
snow" "
- आराम:
& ver.
चूँकि ऐसा cmd.exe
लगता है कि & ver.
यह निर्विवाद है , इसलिए यह इसे &
(कमांड-सीक्वेंसिंग ऑपरेटर) के रूप में व्याख्या करता है , जिसे निष्पादित करने के लिए एक कमांड का नाम है ( ver.
- .
नजरअंदाज कर दिया गया है; ver
रिपोर्ट cmd.exe
का संस्करण जानकारी)।
समग्र प्रभाव है:
- सबसे पहले, केवल
foo.exe
पहले 3 टोकन के साथ मंगाया जाता है ।
- फिर, कमांड
ver
निष्पादित किया जाता है।
यहां तक कि ऐसे मामलों में जहां आकस्मिक कमांड कोई नुकसान नहीं पहुंचाता है, आपका समग्र कमांड डिजाइन के रूप में काम नहीं करेगा, यह देखते हुए कि सभी तर्क इसे पारित नहीं किए जाते हैं।
कई कंपाइलर / दुभाषिए केवल पहचानते हैं\"
- उदाहरण के लिए, GNU C / C ++ कंपाइलर, पायथन, पर्ल, रूबी, यहां तक कि माइक्रोसॉफ्ट के खुद के विंडोज पॉवरशेल जब से मंगवाए जाते हैं cmd.exe
- और, (सीमाओं के अलावा) विंडोज पॉवरशेल के लिए \""
, उनके लिए कोई सरल उपाय नहीं है। इस समस्या के लिए।
अनिवार्य रूप से, आपको पहले से यह जानना होगा कि आपकी कमांड लाइन के कौन से भाग गलत हैं, और उन भागों में चुनिंदा ^
रूप से सभी उदाहरणों को गलत समझा जाता है & | < >
।
इसके विपरीत, का उपयोग ""
सेफ है , लेकिन अफसोस केवल माइक्रोसॉफ्ट-कंपाइलर-आधारित निष्पादकों और बैच फ़ाइलों द्वारा समर्थित है ( बैच फ़ाइलों के मामले में, ऊपर चर्चा की गई quirks के साथ), जो उल्लेखनीय है PowerShell को छोड़कर - अगला अनुभाग देखें।
PowerShell के CLI को cmd.exe
POSIX जैसे गोले से कॉल करना :
नोट: पावरशेल के अंदर कैसे उद्धृत किया जाता है, इसके लिए नीचे अनुभाग देखें ।
जब बाहर से मंगवाया जाता है - जैसे, cmd.exe
कमांड लाइन या बैच फ़ाइल से,
PowerShell [Core] v6 + अब ठीक से""
(इसके अलावा\"
)को पहचानता है , जो उपयोग करने के लिए सुरक्षित है और व्हाट्सएप-संरक्षण दोनों है ।
pwsh -c " ""a & c"".length "
टूटता नहीं है और सही ढंग से पैदावार देता है 6
विंडोज पॉवरशेल (विरासत संस्करण जिसका अंतिम संस्करण 5.1 है) केवल और विंडोज पर और अधिक मजबूत / (भले ही आंतरिक रूप से पॉवरशेल दोहरे-उद्धृत स्ट्रिंग्स में भागने के चरित्र के रूप मेंउपयोग करता हैऔर यह भी स्वीकार करता है- नीचे का खंड देखें) को पहचानता है \"
"""
\""
"^""
: `
""
एक बैच फ़ाइल से Windows PowerShell कोcmd.exe
कॉल करना :
""
टूटता है , क्योंकि यह मूलभूत रूप से असमर्थित है:
powershell -c " ""ab c"".length "
-> त्रुटि "स्ट्रिंग को टर्मिनेटर याद आ रहा है"
\"
और सिद्धांत रूप में"""
काम करते हैं, लेकिन सुरक्षित नहीं हैं :
powershell -c " \"ab c\".length "
इरादा के अनुसार काम करता है: यह आउटपुट 5
( 2 रिक्त स्थान पर ध्यान दें )
- लेकिन यह सुरक्षित नहीं है, क्योंकि
cmd.exe
मेटाचैकर कमांड को तब तक तोड़ते हैं, जब तक कि बच न जाए:
powershell -c " \"a& c\".length "
टूट जाता है , इसके कारण &
, जिसे बचाना होगा^&
\""
है सुरक्षित है, लेकिन सामान्य आंतरिक खाली स्थान के , जो अवांछित जा सकता है:
powershell -c " \""a& c\"".length "
आउटपुट 4
(!), क्योंकि 2 रिक्त स्थान 1 के लिए सामान्यीकृत हैं।
"^""
विंडोज पॉवरशेल के लिए विशेष रूप से सबसे अच्छा विकल्प है , जहां यह सुरक्षित और व्हाट्सएप-संरक्षण दोनों है, लेकिन पॉवरशेल कोर के साथ (विंडोज पर) यह वैसा ही है\""
, जैसे कि व्हाट्सएप- सामान्य । इस दृष्टिकोण की खोज के लिए श्रेय वेनरिक्स को जाता है ।
powershell -c " "^""a& c"^"".length "
कार्य : टूटता नहीं है - के बावजूद &
- और आउटपुट 5
, यानी, सही ढंग से संरक्षित व्हाट्सएप।
PowerShell Core : pwsh -c " "^""a& c"^"".length "
काम करता है , लेकिन आउटपुट 4
, यानी व्हाट्सएप को सामान्य\""
करता है , जैसा कि करता है।
पर यूनिक्स की तरह प्लेटफार्मों (लिनक्स, MacOS), बुला जब PowerShell [कोर] के CLI, pwsh
, से एक POSIX तरह शेल के रूप में इस तरह के bash
:
आप चाहिए का उपयोग\"
से की जो कि है दोनों सुरक्षित और रिक्त स्थान को-संरक्षण :
$ pwsh -c " \"a& c|\".length" # OK: 5
सम्बंधित जानकारी
^
केवल अयोग्य स्ट्रिंग्स में बच चरित्र के रूप में इस्तेमाल किया जा सकता है - डबल-उद्धृत स्ट्रिंग्स के अंदर, ^
विशेष नहीं है और शाब्दिक के रूप में माना जाता है।
- गुफा : बयान में दिए गए मापदंडों का उपयोग टूट गया है
^
call
(यह दोनों उपयोगों पर लागू होता है call
: किसी अन्य बैच फ़ाइल या बाइनरी को लागू करना, और एक ही बैच फ़ाइल में एक सबरूटीन को कॉल करना):
^
में उदाहरणों डबल-कोटेड मान रहे हैं बेवजह दोगुनी , मूल्य में फेरबदल पारित किया जा रहा: जैसे, चर अगर %v%
शाब्दिक मान a^b
, call :foo "%v%"
असाइन "a^^b"
करने के लिए (!) %1
सबरूटीन में (पहले पैरामीटर) :foo
।
- गैर उद्धृत के उपयोग के
^
साथ call
किया जाता है पूरी तरह टूट कि में ^
अब विशेष वर्ण से बचने के लिए इस्तेमाल किया जा सकता जैसे,:call foo.cmd a^&b
चुपचाप टूटता है (बजाय शाब्दिक पास करने काa&b
भीfoo.cmd
, के रूप में बिना मामला होगाcall
-)foo.cmd
कम से कम विंडोज पर भी लागू नहीं किया जाता, (!) 7।
शाब्दिक रूप %
से बचना एक विशेष मामला है , दुर्भाग्यवश, जिसे बैच फ़ाइल के अंदर कमांड लाइन बनाम स्ट्रिंग पर निर्दिष्ट किया गया है या नहीं, इसके आधार पर अलग-अलग वाक्यविन्यास की आवश्यकता होती है ; देख https://stackoverflow.com/a/31420292/45375
- इसकी कमी: एक बैच फ़ाइल के अंदर, का उपयोग करें
%%
। कमांड लाइन पर, %
बच गए नहीं किया जा सकता, लेकिन आप एक जगह है, तो ^
एक में शुरू, अंत में, या एक चर नाम के अंदर गैर उद्धृत स्ट्रिंग (जैसे, echo %^foo%
), आप चर विस्तार (प्रक्षेप) को रोका जा सकता; %
कमांड लाइन पर ऐसे उदाहरण जो एक चर संदर्भ का हिस्सा नहीं हैं, को शाब्दिक (उदाहरण के लिए 100%
) माना जाता है ।
आमतौर पर, चर मानों के साथ सुरक्षित रूप से काम करने के लिए जिसमें रिक्त स्थान और विशेष वर्ण हो सकते हैं :
- असाइनमेंट : डबल-कोट्स की एक ही जोड़ी में वैरिएबल नाम और मान दोनों संलग्न करें ; उदाहरण के लिए, वेरिएबल को
set "v=a & b"
शाब्दिक मान प्रदान करता है (इसके विपरीत, मूल्य के डबल-कोट्स को भाग बना देगा)। के रूप में शाब्दिक उदाहरण बच (केवल बैच फ़ाइलों में काम करता है - ऊपर देखें)।a & b
%v%
set v="a & b"
%
%%
- संदर्भ : यह सुनिश्चित करने के लिए कि उनके मूल्य को प्रक्षेपित नहीं किया गया है, डबल-उद्धरण चर संदर्भ ; उदाहरण के लिए, प्रक्षेप और प्रिंट
echo "%v%"
के मूल्य के अधीन नहीं है (लेकिन ध्यान दें कि डबल-कोट्स को हमेशा प्रिंट किया जाता है)। इसके विपरीत, शाब्दिक गुजरता है करने के लिए , की व्याख्या कमांड अनुक्रमण ऑपरेटर के रूप में है, और इसलिए नाम के एक आदेश पर अमल करने की कोशिश करता है । बयान
के साथ उपरोक्त कैविएट पुनः उपयोग पर भी ध्यान दें ।%v%
"a & b"
echo %v%
a
echo
&
b
^
call
- बाहरी कार्यक्रम आम तौर पर मापदंडों के आस-पास दोहरे उद्धरण चिह्नों को हटाने का ख्याल रखते हैं, लेकिन, जैसा कि नोट किया गया है, बैच फ़ाइलों में आपको इसे स्वयं करना होगा (उदाहरण के लिए,
%~1
1 पैरामीटर से डबल-उद्धरण संलग्न करना) और, दुख की बात है, कोई प्रत्यक्ष नहीं है जिस तरह से मुझे पता है कि echo
एक वैरिएबल वैल्यू को प्रिंट करने के लिए बिना किसी डबल-कोट्स के आलिंगन प्राप्त करना है ।
- नील एक-
for
आधारित वर्कअराउंड प्रदान करता है जो तब तक काम करता है जब तक कि मूल्य में कोई एम्बेडेड दोहरे उद्धरण न हों ; उदाहरण के लिए:
set "var=^&')|;,%!"
for /f "delims=" %%v in ("%var%") do echo %%~v
cmd.exe
करता नहीं पहचान एकल -quotes स्ट्रिंग सीमांकक के रूप में - वे शाब्दिक रूप में माना जाता है और आम तौर पर एम्बेडेड सफेद स्थान के साथ परिसीमित तार करने के लिए इस्तेमाल किया जा सकता; इसके अलावा, यह इस प्रकार है कि एकल-कोट्स और बीच में किसी भी टोकन को निरस्त करने वाले टोकन को उसके cmd.exe
अनुसार अयोग्य और समझा जाता है।
- हालांकि, यह देखते हुए कि लक्ष्य कार्यक्रम अंततः अपने स्वयं के तर्क को पार्स करते हैं, रूबी जैसे कुछ कार्यक्रम विंडोज पर भी एकल-उद्धृत स्ट्रिंग्स को पहचानते हैं; इसके विपरीत, C / C ++ निष्पादक, पर्ल और पायथन उन्हें नहीं पहचानते।
भले ही लक्ष्य कार्यक्रम द्वारा समर्थित हो, हालांकि, एकल-उद्धृत स्ट्रिंग्स का उपयोग करना उचित नहीं है, यह देखते हुए कि उनकी सामग्री संभावित अवांछित व्याख्या से सुरक्षित नहीं है cmd.exe
।
PowerShell के भीतर से उद्धरण :
विंडोज पॉवरशेल की तुलना में बहुत अधिक उन्नत शेल है cmd.exe
, और यह कई वर्षों से विंडोज का हिस्सा है (और पॉवरशेल कोर ने पॉवरशेल अनुभव को मैकओएस और लिनक्स पर भी लाया)।
PowerShell उद्धृत करने के संबंध में आंतरिक रूप से लगातार काम करता है :
- डबल-कोटेड स्ट्रिंग्स के अंदर, डबल-कोट्स का उपयोग करें
`"
या ""
बचने के लिए
- सिंगल-कोटेड स्ट्रिंग्स के अंदर,
''
सिंगल-कोट्स से बचने के लिए उपयोग करें
यह PowerShell कमांड लाइन पर काम करता है और जब PowerShell स्क्रिप्ट्स या फ़ंक्शंस को PowerShell के भीतर से पास कर रहा है ।
(जैसा कि ऊपर चर्चा की गई है, पावरस्से के लिए एक बची हुई डबल-कोट को बाहर से पारित करना आवश्यक है \"
या, अधिक मजबूती से, \""
- और कुछ भी काम नहीं करता है)।
अफसोस की बात है, जब PowerShell से बाहरी कार्यक्रमों को आमंत्रित करते हैं, तो आपको PowerShell के स्वयं के नियमों को समायोजित करने और लक्ष्य कार्यक्रम के लिए भागने की आवश्यकता दोनों का सामना करना पड़ता है :
इस समस्यात्मक व्यवहार पर भी चर्चा की गई और इस जवाब में संक्षेप में बताया गया है
डबल-डबल स्ट्रिंग्स के अंदर डबल- प्रश्न :
स्ट्रिंग पर विचार करें "3`" of rain"
, जो पॉवरशेल-आंतरिक रूप से शाब्दिक में अनुवाद करता है 3" of rain
।
आप एक बाहरी कार्यक्रम के लिए इस स्ट्रिंग पारित करने के लिए चाहते हैं, आप लक्ष्य कार्यक्रम के भागने आवेदन करना अलावा PowerShell के लिए ; आप स्ट्रिंग को C प्रोग्राम में पास करना चाहते हैं, जो उम्मीद करता है कि एम्बेडेड डबल-कोट्स इस प्रकार बचेंगे \"
:
foo.exe "3\`" of rain"
नोट कैसे दोनों `"
- PowerShell खुश करने के लिए - और\
- लक्ष्य कार्यक्रम खुश करने के लिए - उपस्थित होना चाहिए।
एक बैच फ़ाइल को लागू करने के लिए एक ही तर्क लागू होता है, जहां ""
इसका उपयोग किया जाना चाहिए:
foo.bat "3`"`" of rain"
इसके विपरीत, डबल- थॉटेड स्ट्रिंग में सिंगल -क्वॉट एम्बेड करना बिल्कुल भी बचने की आवश्यकता नहीं है।
एकल अंदर -quotes एकल -quoted तार करते नहीं की आवश्यकता होती है अतिरिक्त बचने; विचार करें'2'' of snow'
, जो कि PowerShell का प्रतिनिधित्व है2' of snow
।
foo.exe '2'' of snow'
foo.bat '2'' of snow'
PowerShell ने एकल-उद्धृत स्ट्रिंग्स को लक्ष्य कार्यक्रम में पास करने से पहले डबल-उद्धृत वाले लोगों में अनुवाद किया।
हालांकि, डबल अंदर -quotes एकल -quoted तार , जिसके लिए भागने की जरूरत नहीं है PowerShell , अभी भी के लिए भाग निकले जाने की जरूरत है लक्ष्य कार्यक्रम :
foo.exe '3\" of rain'
foo.bat '3"" of rain'
PowerShell v3 जादू शुरू की --%
विकल्प , कहा जाता रोकने के पार्स करने प्रतीक है, जो दर्द से कुछ दूर, कुछ भी पास करने के बाद यह द्वारा uninterpreted लक्ष्य कार्यक्रम के लिए, को बचाने के लिए cmd.exe
शैली पर्यावरण के वैरिएबल संदर्भ (जैसे, %USERNAME%
) है, जो कर रहे हैं विस्तार किया; उदाहरण के लिए:
foo.exe --% "3\" of rain" -u %USERNAME%
ध्यान दें कि केवल लक्ष्य कार्यक्रम के लिए एम्बेडेड के "
रूप में बचना \"
(और PowerShell के लिए भी नहीं \`"
) पर्याप्त है।
हालाँकि, यह दृष्टिकोण:
- पर्यावरण-चर विस्तार से बचने के लिए पात्रों से बचने की अनुमति नहीं देता है
%
।
- PowerShell चर और अभिव्यक्तियों का प्रत्यक्ष उपयोग रोकता है ; इसके बजाय, कमांड लाइन को पहले चरण में एक स्ट्रिंग चर में बनाया जाना चाहिए, और फिर
Invoke-Expression
एक दूसरे के साथ लागू किया जाना चाहिए ।
इस प्रकार, अपनी कई प्रगति के बावजूद, PowerShell ने बाहरी कार्यक्रमों को कॉल करते समय बचने को बहुत आसान नहीं बनाया है। हालांकि, एकल-उद्धृत स्ट्रिंग्स के लिए इसे समर्थन प्रदान किया गया है।
मुझे आश्चर्य है कि अगर यह विंडोज की दुनिया में मौलिक रूप से संभव है, तो शेल के यूनिक मॉडल पर स्विच करने के लिए शेल को सभी टोकेनाइजेशन और उद्धरण हटाने का अनुमान लगाया जाए , सामने वाला , लक्ष्य कार्यक्रम के बावजूद , और फिर परिणाम टोकन को पास करके लक्ष्य प्रोग्राम को लागू करें। ।