यह विंडोज़ कमांड कैसे काम करती है: इको% पाथ:; = & इको।


23

pathविंडोज़ कमांड-लाइन में चर के अंदर पथ मुद्रित करने के लिए एक समाधान की खोज मैं इस समाधान के लिए आया था । जवाब यह है:

echo %path:;=&echo.%

अब मुझे आश्चर्य है कि यह कैसे काम करता है।


जवाबों:


22

यह एक दिलचस्प समाधान है जो मैंने पहले कभी नहीं देखा है। मुझे समझाने का प्रयास करने दें:

  1. संपूर्ण पथ मुद्रित करने के लिए, का उपयोग करें echo %path%। यह सेमीकॉलन ( ;) के साथ अलग की गई एक लाइन पर सभी निर्देशिकाओं को प्रिंट करेगा
  2. एक चर में एक स्ट्रिंग को खोजने / बदलने के लिए, उपयोग करें %path:a=b%जो सभी aवर्णों को बदल देगाb
  3. echo. का उपयोग एक नई लाइन प्रिंट करने के लिए किया जाता है
  4. &आदेशों को अलग करने के लिए उपयोग किया जाता है, जैसे echo line1&echo line2दो लाइनें प्रिंट करेगा
  5. वास्तव में, न्यूक्लीन प्रिंट करने के लिए कमांड में सेमीकॉलन को बदल दिया जाता है । या हो सकता है कि इसे ' ;कुछ नहीं के साथ प्रतिस्थापित करें, और फिर , एक नई पंक्ति प्रिंट करें ' के रूप में व्याख्या की जाए। मुझे इस पर कोई दस्तावेज नहीं मिल रहा है, इसलिए यह सिर्फ मेरी व्याख्या है। सच कहूं, तो मुझे यह भी नहीं पता था कि यह संभव है, लेकिन तुम जाओ। अद्यतन इस कदम की मेरी व्याख्या से लगता है, और wizzwizz4 द्वारा बेहतर समझाया गया है ।

हम बताए गए %% संकेतों का क्या उपयोग कर सकते हैं echo path? चर के लिए %% का उपयोग किया जाता है?
येकनची

1
हां, यह सही है, जिनका उपयोग किसी वैरिएबल का मान पाने के लिए किया जाता है। उदाहरण के लिए: set greeting=Helloऔर फिर echo %greeting%। भ्रामक रूप से, PATHएक कमांड और एक वैरिएबल दोनों होता है, इसलिए कमांड टाइप करना path, या echo %path%एक ही परिणाम होगा।
बेरेंड

इस वाक्यविन्यास को क्या कहा जाता है? क्या यह रेगेक्स है? या विंडोज़ सीएमडी में इस्तेमाल होने वाली कोई चीज़
yekanchi

मुझे यकीन नहीं है कि अगर इसके लिए कोई नाम है, तो यह डॉस में काम करने का तरीका है। अन्य भाषाएं, जैसे बैश, $PATHउदाहरण के लिए उपयोग होती हैं ।
बेरेंड

2
यह डॉस, बेरेन्ड के साथ कुछ नहीं करना है; और echo."कमांड को एक नई प्रिंट करने के लिए नहीं है"। यह विंडोज एनटी के लिए माइक्रोसॉफ्ट का कमांड दुभाषिया हैcmd ; और echo.यह केवल एक पथ तत्व को प्रिंट करने के लिए कमांड है जो यह सुनिश्चित करता है कि यदि पथ तत्व खाली है तो यह अन्य कार्यक्षमता के लिए स्विच नहीं करता हैecho । पहला echoवास्तव में भी होना चाहिए echo.
JdeBP

30

यह कमांड-लाइन चर प्रतिस्थापन का उपयोग कर रहा है। %path:;=&echo.%का अर्थ है " %path%, लेकिन सभी को प्रतिस्थापित ;करें &echo."। इसका मतलब यह है कि set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

हो जाता है:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.

चूंकि &एक कमांड विभाजक है, यह इसके बराबर है:

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.

डॉस बैच की quirks के कारण, जब इसके बाद कुछ भी नहीं है सिवाय इसके केecho. समान है। अगर ऐसा है, तो यह आपको बताने या बताने के बजाय, कुछ भी प्रिंट नहीं करता है। यह उत्पादन करेगा:echo ECHO

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 

वास्तव में, यह echo.%path:;=&echo.%उस मामले के लिए जिम्मेदार होना चाहिए जहां से %PATH%शुरू होता है ;, लेकिन यह आदेश वैसे भी बहुत चालाक है।


विस्तृत detalias में हो रही है, के बजाय वास्तव में echo( इस्तेमाल किया जाना चाहिए echo.। ऐसा इसलिए है क्योंकि echo.जब आपको कोई फ़ाइल मिली है echo, तो समस्या हो सकती है और यह धीमा है क्योंकि इसे डिस्क ( %CD%और मुझे भी लगता है कि सभी %PATH%) को हर बार इसे चलाने की जांच करनी होगी । (मेरे पास Windows की एक प्रति नहीं है इसलिए मैं इसे स्वयं नहीं देख सकता; क्या यह सिर्फ %CD%या कहीं भी है %PATH%जिसमें echoफ़ाइल की उपस्थिति प्रभावित होगी echo., और यह क्या करता है?)


यह कई ऑपरेटिंग सिस्टमों में Microsoft / IBM कमांड के दुभाषियों का दीर्घकालिक व्यवहार है, और बैच स्क्रिप्ट के लिए विशिष्ट नहीं है। जैसा कि मैंने superuser.com/a/310157/38062 साल पहले उल्लेख किया था, व्हाट्सएप के अलावा कई विराम वर्ण हैं जो कमांड-नाम समाप्ति वर्णों के रूप में गिने जाते हैं।
जेडीबीपी

@JdeBP मुझे लगता है कि एक अधिक कुशल है echo), लेकिन मुझे वास्तव में याद नहीं है। ;(
wizzwizz4

3
echo.वह है जो लोग वर्षों पहले सबसे अधिक प्रसारित करते थे। यह कई पुस्तकों में एक है। दक्षता समस्या नहीं है। विभिन्न फ़ाइलों के अस्तित्व में होने पर निराला व्यवहार। जब मैंने cmdOS / 2 में 16-बिट के लिए 32-बिट प्रतिस्थापन लिखा , तो इन विराम चिह्नों पर कमांड नाम तोड़ना और यह अत्यधिक अनियमित पार्सिंग व्यवहार उन चीजों में से एक है, जिन्हें मैंने जानबूझकर डुप्लिकेट नहीं किया था, और जिसे मैंने दस्तावेज पर रखा था मतभेदों की सूची। मैंने echodotइसके बजाय एक बाहरी आदेश दिया, जिसे कोई भी echo.इच्छानुसार उपनाम दे सकता है ।
JDBP

@JdeBP जो वास्तव में दिलचस्प लगता है! क्या आपको लगता है कि आप उसमें से कुछ का दस्तावेजीकरण कर सकते हैं ?
wizzwizz4

यदि आप विभिन्न टिप्पणी लिंक का अनुसरण करते हैं, तो आप तीसरे पक्ष के मंच संदेश पर समाप्त होते हैं, echo(जो केवल सुरक्षित संस्करण है।
नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.