विंडोज बैच फ़ाइलों की छिपी विशेषताएं


232

विंडोज बैच फ़ाइलों में से कुछ कम जानते हैं, लेकिन महत्वपूर्ण और उपयोगी विशेषताएं क्या हैं?

दिशानिर्देश:

  • प्रति उत्तर एक विशेषता
  • फीचर और उदाहरण दोनों का संक्षिप्त विवरण दें , न कि केवल दस्तावेज़ीकरण की एक कड़ी
  • देशी फ़ंक्शनलिटी के जवाब को सीमित करें , अर्थात, अतिरिक्त सॉफ़्टवेयर की आवश्यकता नहीं है, जैसे विंडोज रिसोर्स किट

स्पष्टता: हम यहां उन लिपियों का उल्लेख करते हैं जो cmd.exe द्वारा संसाधित की जाती हैं, जो कि WinNT वेरिएंट पर डिफ़ॉल्ट है।

(यह भी देखें: विंडोज बैच फाइलें: .bat बनाम .cmd? )

जवाबों:


185

लाइन निरंतरता:

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf

2
मैं इस पिछले हफ्ते की तलाश में था! (चरित्र याद नहीं कर सकते)
chilltemp

21
^ वास्तव में एक उद्धरण चार है। इसका उपयोग करते हुए, आप <और> को उद्धृत कर सकते हैं ताकि वे आउटपुट को पुनर्निर्देशित न करें। ^ एक पंक्ति के अंत में भी लाइन निरंतरता की अनुमति देता है।
चेसो

क्या आप इस छोटी सी लिपि को स्पष्ट कर सकते हैं?
गेरुआ

2
@furtelwart: यह वैसा ही है जैसे कि आपने सभी को एक ही पंक्ति में लिखा हो call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf:। और उस लाइन के सभी मापदंडों को समझने के लिए, बस चलाएं C:\WINDOWS\system32\ntbackup.exe /?
कर्ट फ़िफ़ले

इस विषय के बारे में गहराई से चर्चा करते हुए, कई आदेशों पर कई पंक्तियों में विभाजित किया गया
jeb

150
PUSHD path

आपको पथ द्वारा निर्दिष्ट निर्देशिका में ले जाता है

POPD

आपको उस निर्देशिका में वापस ले जाता है जिसे आपने "पुश" किया था।


5
यह एक पूर्ण स्टैक के रूप में भी काम करता है, इसलिए आप स्टैक पर कई डायरेक्टरीज़ को पुश कर सकते हैं, और फिर जहाँ आप थे उसे वापस लाने के लिए पॉपिंग करते रहें।
किबी

गंभीरता से? कैसे मैं इस सुविधा से पहले कभी नहीं सुना है ?!
जोश हिनमैन

4
'Cmd.exe' चलाएं, फिर 'help' टाइप करें, फिर 'help pushd' या 'pushd /?' टाइप करें।
paxdiablo

86
यदि आप UNC पथ पर जाते हैं, तो यह स्वचालित रूप से आपके लिए एक ड्राइव मैप करेगा और पॉप इसे अनमैप कर देगा।
फेर्रुकियो

2
+1 विशेष रूप से UNC क्षमता के लिए, आपको उसे अपने उत्तर में जोड़ना चाहिए।
एडम मित्ज

109

यकीन नहीं है कि यह बैच फ़ाइल में कितना उपयोगी होगा , लेकिन यह कमांड प्रॉम्प्ट में उपयोग करने के लिए एक बहुत ही सुविधाजनक कमांड है:

C:\some_directory> start .

यह "some_directory" फ़ोल्डर में विंडोज एक्सप्लोरर खोल देगा।

मैंने इसे एक महान समय बचाने वाला पाया है।


1
खैर, मैं भी इसका इस्तेमाल करते हैं। मेरे पास PATH निर्देशिकाओं में से एक में एक "open.cmd" फ़ाइल है, और उस फ़ाइल की एकमात्र चीज़ "@@artart" है। ;)
पॉलियस डे

5
'एक्सप्लोरर' भी 'स्टार्ट' सी: \ some_directory> एक्सप्लोरर के रूप में एक ही काम करता है।
रे

1
मैं इसे "प्रारंभ" के रूप में टाइप करता हूं। ] (स्पष्टता के लिए कोष्ठक) क्योंकि शुरुआत कभी-कभी पहले शीर्षक के शीर्षक के बारे में बारीक होती है।
सिस्टम PAUSE

1
यदि आप एक मैक पर हो, एक open .ही बात करता है।
पॉल

1
startजिस तरह से अधिक से अधिक सिर्फ वर्तमान फ़ोल्डर खुला है। आप इसे किसी भी फ़ाइल को पास कर सकते हैं और यह इसे कॉन्फ़िगर किए गए दर्शक के साथ खोल देगा। इसे एक URL दें और आपका डिफ़ॉल्ट ब्राउज़र खुलता है, आदि ...
idbrii

87

मैंने हमेशा उन टिप्पणियों को पढ़ना मुश्किल पाया है जो प्रत्येक पंक्ति में एक कीवर्ड द्वारा चिह्नित हैं:

REM blah blah blah

पढ़ने में आसान:

:: blah blah blah

8
मैंने सुना है :: REM की तुलना में अधिक कुशल है क्योंकि REM उस सामान पर पर्यावरण चर विस्तार करने का प्रयास करता है जो इसके बाद होता है, लेकिन :: नहीं करता है।
स्कॉट लैंगहम

47
वास्तव में, :: एक मजाकिया नाम वाला एक लेबल है; यदि आप किसी ब्लॉक के अंदर (कोष्ठक में) इसका उपयोग करते हैं, तो :: काम नहीं करेगा क्योंकि लेबल की अनुमति नहीं है। REM वहां जरूर काम करता है।
मिही

ध्यान दें कि remयह एक प्रलेखित खोजशब्द है जबकि ::केवल एक कार्यान्वयन विवरण है। हालांकि यह संभावना नहीं है कि ::यह काम करना बंद कर देगा यह आम तौर पर अनैच्छिक व्यवहार पर भरोसा नहीं करना उचित है।
जॉय

तुम भी goto :लेबल करने के लिए कूद करने के लिए उपयोग कर सकते हैं । :-)और goto -)भी काम करेगा।
स्वेन मार्नाच

79

चर पदार्थ:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456

3
बदसूरत, लेकिन वेरी उपयोगी!
गेरुआ

1
@furtelwart लगता है कि बैच आदर्श वाक्य हो सकता है
rzrgenesys187

तारीखों को प्रारूपित करने के लिए यह बहुत बढ़िया (हालाँकि मुझे जो समस्या मिली वह थी विस्टा / 7 और xp आउटपुट DATE अलग तरीके से)
डैनियल

ध्यान दें कि दुर्भाग्यवश, इसे स्थानीय छोरों ( for %a in ...) के साथ नहीं जोड़ा जा सकता है क्योंकि उन्हें समापन प्रतिशत संकेत की आवश्यकता नहीं होती है क्योंकि यह चर चर नहीं करता है; आपको पहले उन्हें एक पर्यावरण चर (विलंबित विस्तार का उपयोग करके) असाइन करना होगा और फिर एक विकल्प निकालना होगा।
रोलकौ

यह एक अपरिहार्य बदसूरत है यदि आप तारीखों के साथ कुछ करना चाहते हैं (जैसे बैकअप फ़ाइल नाम)। विंडोज कमांड लाइन की सामान्य कुरूपता को देखने के बाद, मैं देखता हूं कि विंडोज ज्यादातर बिंदु क्यों है और क्लिक करें :) हालांकि वे कहते हैं कि नया पावरशेल बेहतर है।
हालिल Halzgür

72

आदेश के लिए ! जबकि मुझे बैच फ़ाइलों को लिखने से नफरत है, मैं इसके लिए आभारी हूं।

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

myfile.txt में प्रत्येक पंक्ति को पार्स करेगा, एक अर्धविराम के साथ शुरू होने वाली रेखाओं को अनदेखा करते हुए, प्रत्येक पंक्ति से शरीर के लिए 2 और 3 के टोकन पास करके, कॉमा और / या रिक्त स्थान द्वारा सीमांकित टोकन के साथ। 3 डी टोकन प्राप्त करने के लिए बॉडी स्टेटमेंट संदर्भ% i के लिए सूचना% i, 3 ​​जी टोकन प्राप्त करने के लिए% j, और 3 के बाद सभी शेष टोकन प्राप्त करने के लिए% k।

तुम भी निर्देशिका, निर्देशिका सामग्री, आदि पर iterate का उपयोग कर सकते हैं ...


4
मैंने लिखने के लिए बैच फ़ाइलों को सीमित और भयानक पाया है, लेकिन वे कभी-कभी उपयोगी होते हैं।

2
मेरे भाग्य का बहाना करो, लेकिन यह कैसे पृथ्वी पर है? मुझे लगता है कि यदि आप छोरों के लिए नहीं जानते हैं, तो आप बैच स्क्रिप्टिंग नहीं जानते हैं।
स्टाइलिंग

11
पराधीन या नहीं, यह यातना है। (कुछ लोग एक आवश्यक बुराई पर बहस करेंगे।)
हार्पो

मुझे इसे कुछ बार उपयोग करना पड़ा और इस वाक्य रचना को बनाने वाले को निकाल दिया जाना चाहिए। तोप से। धूप में। यह बुरा है।
विटालिब

1
@CodingWithStyle: हर बार जब मुझे एक बैच फ़ाइल में लूप के लिए लिखना होता है, तो स्क्रिप्ट एक बैश लांचर बन जाती है और इसके बजाय बैश (या अजगर) में स्क्रिप्ट को फिर से
लिखती है:)

60

रेम या :: लाइनों के साथ एक स्क्रिप्ट को लिटाने के बजाय, मैं प्रत्येक स्क्रिप्ट के शीर्ष पर निम्न कार्य करता हूं:

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

ध्यान दें कि आप पाइप और पुनर्निर्देशन पात्रों का उपयोग कैसे कर सकते हैं, उन्हें बिना भागे।


3
"/?" और फिर आप उस अनुभाग को मदद पाठ के रूप में प्रतिध्वनित कर सकते हैं।
डेन्कोडायमेनिस्क

6
हम्म, साक्षर बैच प्रोग्रामिंग?!
मुहम्मद अल्करौरी

54

पथ (ड्राइव के साथ) जहां स्क्रिप्ट है: ~ dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%

मैं आमतौर पर इसके लिए% CD% का उपयोग करता हूं। शायद यह सभी डॉस शेल संस्करणों में उपलब्ध नहीं है?
शाऊल डोलगिन

11
% CD% वर्तमान निर्देशिका है जबकि% ~ dp0 वह निर्देशिका है जहाँ पर चलने वाली स्क्रिप्ट स्थित है।
RealHowTo

इसके अलावा, मुझे नहीं लगता कि% CD% पहले मौजूद था ... XP, शायद। मुझे पता है कि विंडोज के कुछ पुराने संस्करण नहीं हैं।
थॉमस ओवंस

1
यदि बल्ल किसी अन्य ड्राइव में है, तो आपको इसके बजाय cd / d% BAT_HOME% का उपयोग करना चाहिए। अगर मुझे सही याद है, तो यह पुराने डॉस के साथ काम नहीं करेगा, हालांकि।
केटोरिन

यदि आप एक नेटवर्क पथ पर एक बैच चलाते हैं तो सीडी या पुशड BATH_HOME% काम नहीं करेगा।
बेनोइट

49

% ~ Dp0 का टुकड़ा पहले ही उल्लेख किया गया था, लेकिन इसमें वास्तव में अधिक है: चरित्र (s) के बाद ~ जो जानकारी निकाली गई है उसे परिभाषित करें।
पैच फ़ाइल नाम
d की वापसी में कोई अक्षर परिणाम नहीं - ड्राइव अक्षर
p लौटाता है - पथ
s लौटाता है - लघु पथ
x लौटाता है - फ़ाइल एक्सटेंशन लौटाता है
इसलिए यदि आप c: \ Temp से नीचे स्क्रिप्ट test.bat निष्पादित करते हैं। \ long dir name \ folder,

@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0

आपको निम्न आउटपुट मिलते हैं

test
c:
\Temp\long dir name\
c:\Temp\long dir name\
.bat
c:\Temp\LONGDI~1\test.bat
\Temp\LONGDI~1\

और अगर आपकी स्क्रिप्ट में कोई पैरामीटर पास किया गया है
टेस्ट c: \ temp \ mysrc \ test.cpp के
तो उसी हेरफेर को% 1 चर के साथ किया जा सकता है।

लेकिन% 0 के विस्तार का परिणाम स्थान पर निर्भर करता है!
बैच के "शीर्ष स्तर" पर यह वर्तमान बैच फ़ाइल नाम तक फैलता है।
एक फ़ंक्शन (कॉल) में, यह फ़ंक्शन नाम तक फैलता है।

@echo off
echo %0
call :test
goto :eof

:test
echo %0
echo %~0
echo %~n0

आउटपुट है (बैचबाइल myBatch.bat के साथ शुरू किया गया है)

myBatch.bat
:test
:test
myBatch

43

CALL, EXIT / B, SETLOCAL & ENDLOCAL का उपयोग करके आप स्थानीय चरों के साथ सबरूटीन्स लागू कर सकते हैं।

उदाहरण:

@echo off

set x=xxxxx
call :sub 10
echo %x%
exit /b

:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b

यह छपेगा

11
xxxxx

भले ही: उप संशोधित एक्स।


6
आपको गोटो का उपयोग करना चाहिए: एओफ़ के बजाय बाहर निकलें / बी, एक ही काम करता है लेकिन इसे करने के लिए अधिक मानक तरीका है।
फिलीबर्ट पेरुसे

2
इसके लिए एक मानक है? O_o
पॉलियस

3
मेरी गलती। मैंने सोचा कि आप स्पष्ट रूप से परिभाषित करते हैं: ईओएफ लेबल और उस के लिए एक गोटो कर रहा है। मुझे महसूस नहीं हुआ कि प्रत्येक बैच फ़ाइल के अंत में एक निहित: ईओएफ लेबल है।
फेरुचियो

3
हालाँकि, यदि आप एक त्रुटि को सेट करने के लिए सबरूटीन चाहते हैं, तो आपको निकास / बी का उपयोग करना होगा। उदाहरण के लिए: बाहर निकलें / बी 3
क्रिस नो

6
मैंने एक सबरूटीन से लौटने के लिए "गोटो: ईओफ़" के बजाय "एग्जिट / बी" का उपयोग करना सबसे अच्छा पाया है, "गोटो: ईओफ़" में समस्या है कि आप इसे निगलने के लिए एक त्रुटि कोड वापस कर सकते हैं। उदाहरण के लिए, यदि आप "यदि कुछ मौजूद है, तो यह यहाँ है" का उपयोग करें, यह त्रुटिलेवल सेट करेगा यदि कुछ मौजूद नहीं है, लेकिन यह गलत नहीं है, और एक त्रुटि कोड नहीं है जिसे आप वापस करना चाहते हैं (जो है " गोटो: ईओएफ "करेगा)।
स्कॉट लैंगहम

42

चुपके सेकंड एन सेकंड (cmd.exe का हिस्सा नहीं है, लेकिन अतिरिक्त सॉफ्टवेयर नहीं है क्योंकि यह विंडोज के साथ आता है), पिंग लाइन देखें। आपको N + 1 पिंग की आवश्यकता है क्योंकि पहली पिंग बिना किसी देरी के निकल जाती है।

    echo %time%
    call :waitfor 5
    echo %time%
    goto :eof
:waitfor
    setlocal
    set /a "t = %1 + 1"
    >nul ping 127.0.0.1 -n %t%
    endlocal
    goto :eof

2
इससे भी बेहतर यह है कि आप इसे दोबारा लिखने की परेशानी से बचाने के लिए इसे स्लीप जैसी फाइल में डाल दें।
erjiang

1
... और PATH पर्यावरण चर में कुछ निर्देशिका में sleep.bat डाल दिया
स्कोरग्राफिक

मैं इसे बाहर रखने के खिलाफ हूं, कम पोर्टेबल बनाता है ... विंडोज सिस्टम में।
सोरिन

37

"प्लंबिंग" से बचना:

echo ^| ^< ^> ^& ^\ ^^

3
मैं शर्त लगाता हूँ कि डॉस एस्केप चरित्र अच्छी तरह से ज्ञात नहीं है। अच्छा था।
जोशुआ

12
आह, यह समझाता है कि यह लाइन निरंतरता ऑपरेटर के रूप में अच्छी तरह से क्यों है - यह नई लाइन से बचता है, जैसे बैश में \ ...
लींडर

@leander: हाँ, लेकिन यह केवल LF (और CR नहीं) से बच सकता है, क्योंकि सभी CR को पहले हटा दिया जाता है
jeb

तो यह क्यों विंडोज पर Git का उपयोग कर diff के खिलाफ पिछले प्रतिबद्ध (है HEAD^) समस्याग्रस्त है।
डैनियल ट्रेबिएन

31

आदेशों को चलाने और आउटपुट को संसाधित करने में सक्षम होने (जैसे बैश में '$' () 'के बैकटिक्स)।

for /f %i in ('dir /on /b *.jpg') do echo --^> %i

यदि फ़ाइल नाम में स्थान हैं, तो इसका उपयोग करें:

for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i

2
उन फिल्नामों के साथ काम नहीं करता है जिनके नाम में स्थान है ... यह काम करता है: / f "tokens = *"% i in ('dir / on / b * .jpg') do echo - ^>% i
doekman

अच्छी पकड़। व्यक्तिगत रूप से मुझे लगता है कि फ़ाइल के नाम में रिक्त स्थान नर्क के नौवें चक्र की गहराई से बुराई छिपी चीजें हैं। लेकिन हमें उनके लिए पूरा करना चाहिए, मुझे लगता है।
paxdiablo 10

यही craziest सिंटैक्स मैंने अभी तक देखा है। क्या यह काम करता है अगर आपने यह backtick.bat बनाया है और स्ट्रिंग में पास हो गया है?
इडबरी

30

एक खाली फ़ाइल बनाना:

> copy nul filename.ext

6
@ देवियो: गूंज। एक खाली लाइन डालता है। तो फ़ाइल खाली नहीं होगी!
पौलिअस

4
मैं उसके लिए उपयोग करता हूं type nul > filename.ext
बेनोइट

अच्छा मैं सोच रहा था कि क्या लंबे समय से एक स्पर्श बराबर था।
२१:३

मैंने हमेशा उपयोग किया हैren > blah.txt
Synetech

28

कमांड से सभी आउटपुट को छुपाने के लिए> nul 2> & 1 पर रीडायरेक्ट करें।

उदाहरण के लिए, कुछ कमांड लाइन प्रोग्राम आउटपुट प्रदर्शित करते हैं भले ही आप> nul पर रीडायरेक्ट करते हों। लेकिन, यदि आप आउटपुट को नीचे की लाइन की तरह रीडायरेक्ट करते हैं, तो सभी आउटपुट को दबा दिया जाएगा।

PSKILL NOTEPAD >nul 2>&1

संपादित करें: यह कैसे काम करता है, इसकी व्याख्या के लिए एक कमांड के आउटपुट को अनदेखा करना देखें ।


1
क्या आप जानते हैं कि यह कैसे काम करता है? 2> और 1 बिट का अर्थ क्या है?
स्कॉट लैंगहम

12
Nul nul को> nul पुनर्निर्देशित करता है। 2> और 1 STDERR को जहाँ भी इंगित कर रहा है, वहां रीडायरेक्ट करता है।
aphoria 18

विशेष रूप से, मुझे लगता है कि 2> & 1 एक "फ़ाइलहैंड क्लोन" है, STDERR को STDOUT के क्लोन में सेट करता है। > NUL के बाद इसे रखना महत्वपूर्ण है, क्योंकि आप STDOUT को क्लोन करना चाहते हैं, क्योंकि इसे पुनर्निर्देशित किया गया है, पहले नहीं। (कृपया मुझे सही करें अगर मैं यहाँ गलत हूँ।)
लींडर

1
सोच के लिए आप में से जो जहां PSKILL से आता है, बाहर की जाँच sysinternals.com । यदि आप प्रो संस्करण पर हैं, तो आपके पास एक देशी TSKILL कमांड होनी चाहिए जो कमोबेश एक जैसी हो।
स्टाइलिंग के साथ कोडिंग

1
यदि आपके पास pskill या tskill नहीं है, तो मेरे द्वारा उपयोग किए गए अधिकांश विंडोज सिस्टम taskkill
इडबरी

25
PAUSE

निष्पादन रोक देता है और निम्नलिखित संकेत प्रदर्शित करता है:

जारी रखने के लिए किसी भी कुंजी को दबाएं । । ।

उपयोगी यदि आप एक बैच को विंडोज एक्सप्लोरर में डबल-क्लिक करके चलाना चाहते हैं और वास्तव में कमांड विंडो के फ्लैश के बजाय आउटपुट को देखना चाहते हैं।


मैं शायद ही इसे "अंडरड्यूड" कहूंगा क्योंकि मैं इसे हर स्क्रिप्ट के अंत में टैग करता हूं जो मैं लिखता हूं। फिर से, यह इतनी अच्छी तरह से काम नहीं करता है जब आप अपनी आईडीई को स्क्रिप्ट चलाना चाहते हैं और आउटपुट कैप्चर करते हैं, क्योंकि आईडीई में आपके लिए आमतौर पर प्रेस को दबाने का कोई तरीका नहीं है ...
निकोलस फ्लायेंट

15
"पॉज़" की एक साफ-सुथरी विशेषता यह है कि अगर कोई "कुंजी" प्राप्त करने के लिए कोई टर्मिनल नहीं है (जैसे कि यदि आपका बैच फ़ाइल सिस्टम सेवा से चलाया जाता है), तो यह पता लगाता है और बस चलता रहता है ...
leander

4
+1 से चार्ली सोमरविले, यह इतना प्रसिद्ध है कि हर खेल प्रोग्रामर के 'go.bat' ने 90 के दशक की शुरुआत में इसका इस्तेमाल किया।
LiraNuna

6
अपनी सभी बैच फ़ाइलों को प्रदूषित करने के बजाय (और उन्हें सीएलआई गीक्स के लिए उपयोग करने के लिए कष्टप्रद), आप स्टार्ट / रन का उपयोग कर सकते हैं और फिर 'cmd / k' और बैच फ़ाइल नाम टाइप कर सकते हैं। या HKCR \ batfile \ shell \ open \ कमांड डिफॉल्ट स्ट्रिंग को 'cmd / k "% 1"% *' में बदलें। या एक और बैचफिल बनाएं जो सिर्फ '@cmd / k $ *' चलाता है, इसे डेस्कटॉप पर रखें और उस पर अपनी अन्य बैच फ़ाइलों को छोड़ दें। PAUSE के बहुत सारे विकल्प हैं। कृपया उन पर विचार करें।
सिस्टम PAUSE

1
@gnud: आप अभी भी स्क्रिप्ट पर पाइप कर सकते हैं: echo.|batch-with-pause.bat'किसी भी कुंजी' को दबाने के समान प्रभाव होगा ...
कर्ट फ़िफ़ल

25

बैश के बराबर (और अन्य गोले)

echo -n Hello # or
echo Hello\\c

जो Helloएक अनुगामी न्यूलाइन के बिना " " आउटपुट करता है । ऐसा करने के लिए एक cmd हैक:

<nul set /p any-variable-name=Hello

set /pइनपुट के लिए उपयोगकर्ता को संकेत देने का एक तरीका है। यह दिए गए स्ट्रिंग का उत्सर्जन करता है और फिर प्रतीक्षा करता है, (उसी लाइन पर, यानी, CRLF), उपयोगकर्ता के लिए एक प्रतिक्रिया टाइप करने के लिए।

<nul बस एक खाली प्रतिक्रिया पाइप करने के लिए set /p कमांड के , इसलिए शुद्ध परिणाम उत्सर्जित शीघ्र स्ट्रिंग है। (उपयोग किया गया वैरिएबल खाली रिपॉजिट के कारण अपरिवर्तित रहता है।)

समस्याएँ हैं: यह एक प्रमुख समान चिह्न आउटपुट के लिए संभव नहीं है, और Vista पर प्रमुख व्हाट्सएप वर्ण हटा दिए जाते हैं, लेकिन XP पर नहीं।


18

वातावरण चर सेट करते समय खोजें और बदलें:

> @set fname=%date:/=%

... टाइमस्टैम्प्ड फ़ाइल नामों में उपयोग के लिए एक तारीख से "/" हटाता है।

और सबस्ट्रिंग भी ...

> @set dayofweek=%fname:~0,3%

17

पूर्णांक अंकगणित:

> SET /A result=10/3 + 1
4

SET को गणना करने की क्षमता कब तक मिली है? विंडोज एक्स पी?
16

1
यदि आप पूछ रहे हैं कि मान कितना बड़ा हो सकता है, मेरा मानना ​​है कि यह 32-बिट है। तो +/- 2 बिलियन।
क्रिस नू

1
मुझे लगता है कि सवाल यह था कि SET की गणना कब तक हो पाई है? Windows XP के बाद से?
माइकल मायर्स

3
मैं बात करता हूँ कि CMD.EXE का SET NT 3.1 या तो गणना करने में सक्षम है। किसी को भी यह नोटिस करने में काफी समय लग गया कि CMD.EXE COMMAND.COM की तरह बिल्कुल नहीं था ...
RBerteig

16

कमांड विभाजक:

cls & dir
copy a b && echo Success
copy a b || echo Failure

दूसरी पंक्ति में, & कमांड के बाद कमांड केवल तभी चलती है जब पहला कमांड सफल होता है।

तीसरी पंक्ति में, आज्ञा के बाद || केवल तभी चलता है जब पहला कमांड विफल हो गया हो।



15

आप चेन कर सकते हैं यदि बयानों को शॉर्ट-सर्कुलेटिंग बूलियन `और 'जैसा प्रभाव मिलता है।

if foo if bar baz

1
यह वास्तव में सिर्फ घोंसले के शिकार के लिए एक शॉर्टकट है: if foo ( if bar ( baz ) )(कोष्ठक के बाद की नई
कहानियों की

14

जल्दी से एक यूनिकोड टेक्स्ट फाइल (16bit / char) को ASCII DOS फाइल (8bit / char) में बदलने के लिए।

C:\> type unicodeencoded.txt > dosencoded.txt

एक बोनस के रूप में, यदि संभव हो तो, अक्षर सही ढंग से मैप किए गए हैं।


1
यह एक ANSI डॉस फ़ाइल है - ASCII 7bit / char है।
MarkJ

लोल, यह एक विरोधी पैटर्न है, इस रूपांतरण के असफल होने की संभावना अधिक है। यूनिकोड का समर्थन करने वाला केवल 8 बिट एन्कोडिंग UTF-8 है, लेकिन M $ के लिए धन्यवाद, आपके पास Windows के लिए सेट UTF-8 कोडपेज नहीं हो सकता है।
सोरिन

14

यदि ब्लॉक संरचना:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)

3
जब तक आप जानते हैं कि चर का विस्तार एक ही बार में किया जाएगा (बिना देरी किए विस्तार) - यानी आप समझदारी से% ERRORLEVEL% का उपयोग नहीं कर सकते।
डंकन स्मार्ट

आप वहां लेबल का उपयोग भी नहीं कर सकते हैं (जिसमें वे :: शैली टिप्पणियाँ शामिल हैं) क्योंकि यह समय से पहले बयान को समाप्त कर देगा।
स्टाइल

2
@ डंकन: आपको %ERRORLEVEL%वैसे भी छद्म चर का उपयोग नहीं करना चाहिए ; if errorlevel <foo>इसके लिए क्या है और यह वास्तव में ऐसे ब्लॉकों में काम करता है।
जोए

12

चरों के विलंबित विस्तार (अच्छे माप के लिए फेंके गए पदार्थों के साथ):

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set full=/u01/users/pax
:loop1
    if not "!full:~-1!" == "/" (
        set full2=!full:~-1!!full2!
        set full=!full:~,-1!
        goto :loop1
    )
    echo !full!
    endlocal

12

बहुत अधिक कार्यक्षमता प्रदान नहीं करता है, लेकिन आप कुछ उपयोगों के लिए शीर्षक कमांड का उपयोग कर सकते हैं, जैसे कि टास्क बार में लंबी स्क्रिप्ट पर स्थिति प्रदान करना, या केवल उपयोगकर्ता प्रतिक्रिया बढ़ाने के लिए।

@title Searching for ...
:: processing search
@title preparing search results
:: data processing

2
दिलचस्प। हालांकि इसके बाद आप स्पष्ट रूप से नियमित सुविधा खो देते हैं, जो कि वर्तमान में चल रही कमांड को दिखाना है। क्या इसे रीसेट करने का कोई तरीका है?
क्रिस नू

2
Technet.microsoft.com/en-us/library/bb491017.aspx का कहना है कि इसे अपने दम पर "शीर्षक" के साथ रीसेट किया जा सकता है, लेकिन यह विंडोज 7 पर काम नहीं करता ...
.com/

11

एक संपादक काम नहीं है और एक बैच फ़ाइल बनाने की जरूरत है?

copy con test.bat

बस कमांड टाइप करें, एक नई लाइन के लिए एंटर दबाएँ। फ़ाइल बंद करने के लिए Ctrl-Z और Enter दबाएं।


4
हे, कि मुझे वापस ले जाता है।
स्टाइल जूल 5'09 के साथ कोडिंग

11

पर स्ट्रिंग घटाव के उदाहरण dateऔर timeफ़ाइल पाने के लिए नाम "YYYY-MM-DD HH: MM: SS.txt"

echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"

मैं colorयह बताने के लिए उपयोग करता हूं कि क्या मेरी स्क्रिप्ट सफलतापूर्वक समाप्त हो गई, विफल रही, या पाठ और पृष्ठभूमि के रंग को बदलकर कुछ इनपुट की आवश्यकता थी। यह वास्तव में मदद करता है जब आपके पास आपके विचार की पहुंच में कुछ मशीन होती है लेकिन काफी दूर

रंग XY

जहां X और Y से हेक्स मान 0है F, जहां X - पृष्ठभूमि, Y - पाठ, जब X = Y रंग नहीं बदलेगा।

रंग Z

टेक्स्ट कलर को 'Z' में बदलता है और ब्लैक बैकग्राउंड सेट करता है, 'कलर 0' काम नहीं करेगा

रंग कॉल के नाम के लिए

रंग ?


संपादित; _ की व्याख्या इटैलिक के रूप में की गई। कोड का अच्छा सा।

@ डंकन स्मार्ट: यह सच नहीं है, यह यूके अंग्रेजी में भी काम करता है (हालांकि तकनीकी रूप से इसे "रंग",
जीआरआर

10

रिक्ति और बच पात्रों के साथ उत्पादन पर कुल नियंत्रण ।:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>

1
वह कैसे काम करता है? टेक्स्ट आउटपुट की शुरुआत को डॉट सीमांकित करता है?
क्रिस नोए

3
"इको एक्स" आउटपुट करेगा "<स्पेस> एक्स", "इको एक्स" केवल "एक्स" आउटपुट देगा। यह अग्रणी स्थानों की अनुमति देता है। इसके अलावा "^" एस्केप कैरेक्टर cmd को उन सभी "<" और ">" कैरेक्टर्स को I / O रीडायरेक्शन समझने से रोक देगा।
paxdiablo

1
इको (बेहतर है, क्योंकि इको "इको" नामक एक फाइल के लिए एक फ़ाइल खोज बनाता है यदि यह फ़ाइल इको मौजूद है। विफल रहता है, यदि नहीं तो आंतरिक इको निष्पादित होता है, लेकिन यह इको की तुलना में धीमा है
jeb

9

TheSoftwareJedi ने पहले ही कमांड के लिए उल्लेख किया है, लेकिन मैं इसे फिर से उल्लेख करने जा रहा हूं क्योंकि यह बहुत शक्तिशाली है।

निम्न YYYYMMDD प्रारूप में वर्तमान दिनांक को आउटपुट करता है, बैकअप के लिए निर्देशिकाओं को बनाते समय मैं इसका उपयोग करता हूं।

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a

2
यूरोप में निश्चित रूप से DATE / T रिटर्न 29/10/2008 और अमेरिका में 10/29/2008 ... तो कुछ स्थानीयकरण की आवश्यकता हो सकती है! ;-)

ये सही है! लेकिन आप यह पता लगाने के लिए कि किस दिनांक प्रारूप का उपयोग किया गया है, तिथि कमांड का दुरुपयोग कर सकते हैं।
रेमोनेडो

4
यह के लिए, imo का अत्यधिक उपयोग है। मुझे लगता है कि मैं सिर्फ% DATE का उपयोग करूंगा: ~ 10,4 %% DATE: ~ 4,2 %% DATE: ~ 7,2% इसके लिए डेट कमांड चलाने के बजाय इसके लिए पार्स करें।
स्टाइलिंग के साथ कोडिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.