विंडोज बैच फ़ाइल के माध्यम से कई लाइनों में लंबी कमांड को विभाजित करें


735

मैं एक बैच फ़ाइल में कई आदेशों पर लंबी कमांड कैसे विभाजित कर सकता हूं?

जवाबों:


917

आप कैरेट के साथ लंबी लाइनों को तोड़ सकते हैं ^जब तक आपको याद है कि कैरेट और उसके बाद की नई लाइन पूरी तरह से हटा दी जाती है। इसलिए, यदि कोई स्थान होना चाहिए जहां आप लाइन को तोड़ रहे हैं, तो एक स्थान शामिल करें। ( नीचे उस पर और अधिक )

उदाहरण:

copy file1.txt file2.txt

के रूप में लिखा जाएगा:

copy file1.txt^
 file2.txt

95
यदि आप ^अपने आदेश पाठ के ठीक पहले और बाद में कोई स्थान जोड़ते हैं, तो आप बिना स्थान के अगली पंक्ति शुरू कर सकते हैं ।
जोसेफ डेगले

4
@SebaIllingworth - नहीं, आप हमेशा [SPACE] + [^] और दो रिक्त पंक्तियों को जोड़ सकते हैं, जब यह echoएड हो तो कुल २ लाइन-फीड्स बना सकते हैं ।
जेम्स के

12
सुरक्षा के लिए हमेशा खाली लाइन के साथ समाप्त होता है जब कैरेट का उपयोग करते हैं, बैच फ़ाइल में सरल कैरेट सभी मेमोरी का उपभोग करते हैं
मैट विल्की

4
@GavinMiller: " Caret ^ कॉपी और file1.txt के बाद एक नई लाइन पर काम नहीं करेगा" यह सच नहीं है। आप लाइन को कहीं भी विभाजित कर सकते हैं, एक शब्द के बीच में, जैसे co^␍py ^␍file1 ^␍file2। मैं तुम्हें बचने के भ्रम को अपनी टिप्पणी को हटाने के सुझाव देते हैं, विशेष रूप से के रूप में इस तरह के एक questyion लोकप्रिय एक है
Borodin

3
एक गोटा यहाँ है कि ^ को लाइन पर अंतिम वर्ण होना चाहिए - अर्थात इसके बाद कोई स्थान नहीं। मुझे इससे परेशानी हो रही थी और यह पता चला कि मेरे पास देखभाल के बाद रिक्त स्थान का एक गुच्छा था - संपादक जो मैं उपयोग कर रहा था उसमें आसानी से दिखाई नहीं दे रहा था।
ग्रेगएनजेड

266

देखभाल के लिए नियम है:

लाइन के अंत में एक कैरेट, अगली पंक्ति को जोड़ देता है, एपेंडेड लाइन का पहला चरित्र बच जाएगा।

आप कई बार कार्यवाहक का उपयोग कर सकते हैं, लेकिन पूर्ण पंक्ति ~ 8192 वर्ण (Windows XP, Windows Vista और Windows 7) की अधिकतम पंक्ति लंबाई से अधिक नहीं होनी चाहिए।

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

अगले चरित्र के भागने को दबाने के लिए आप एक पुनर्निर्देशन का उपयोग कर सकते हैं।

पुनर्निर्देशन कार्यवाहक से ठीक पहले होना चाहिए। लेकिन कैरेट से पहले पुनर्निर्देशन के साथ एक जिज्ञासा मौजूद है।

यदि आप कैरेट पर टोकन रखते हैं तो टोकन हटा दिया जाता है।

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

और लाइन फीड को स्ट्रिंग में एम्बेड करना भी संभव है :

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

खाली लाइन सफलता के लिए महत्वपूर्ण है। यह केवल विलंबित विस्तार के साथ काम करता है, अन्यथा लाइन फीड के बाद बाकी लाइन को नजरअंदाज कर दिया जाता है।

यह काम करता है, क्योंकि लाइन के अंत में कैरेट अगली पंक्ति के फ़ीड को अनदेखा कर देता है और अगले चरित्र से बच जाता है, भले ही अगला चरित्र भी एक लाइन फीड हो (इस चरण में गाड़ी के रिटर्न को हमेशा अनदेखा किया जाता है)।


लाइन फीड उदाहरण के साथ अंतिम कोड ब्लॉक रिक्त लाइन को प्रदर्शित नहीं करता है, भले ही यह वहां हो। (कम से कम यह IE7 में दिखाई नहीं देता है) इसके बजाय एक blockquote का उपयोग करके पुन: स्वरूपित करने का प्रयास करें।
debbham

5
सवाल यह है कि क्या हमें एक खराब टूल का समर्थन करना चाहिए जो नियमों का पालन नहीं करता था (कोई इसे ब्राउज़र कहता है, लेकिन यह नहीं है) या क्या आपको ब्राउज़र पर स्विच करना चाहिए?
जेब

1
मेरे पास मेरे मूल्यों के आसपास दोहरे उद्धरण थे, जैसा कि var var = "text here ^" में है, लेकिन यह काम नहीं करता है। डबल कोट निकालें और यह ठीक है।
rjt

1
@jeb, ने cmd स्क्रिप्ट को विफल करते हुए एक उदाहरण लिखा, लेकिन फिर यह प्रश्न पाया: stackoverflow.com/questions/4643376/…
rjt

यह काम नहीं करता है यदि अगली पंक्ति एक उद्धरण चिह्न के साथ शुरू होती है: copy ^[newline]"file1.txt" ^[newline]"file2.txt"काम नहीं करता है! मुझे एक स्थान जोड़ना था copy ^[newline] "file1.txt" ^[newline] "file2.txt":।
अलेक्जेंडर गेल्बुख

70

(यह मूल रूप से वेन के उत्तर का पुनर्लेखन है, लेकिन कैरट के चारों ओर भ्रम की स्थिति साफ हो गई है। इसलिए मैंने इसे एक CW के रूप में पोस्ट किया है। मैं उत्तरों के बारे में शर्मिंदा नहीं हूं, लेकिन पूरी तरह से उन्हें फिर से लिखना अनुचित लगता है।)

आप कैरट ( ^) के साथ लंबी लाइनें तोड़ सकते हैं , बस याद रखें कि कैरेट और उसके बाद आने वाली नई लाइन पूरी तरह से कमांड से हटा दी जाती है , इसलिए यदि आप इसे डालते हैं जहां एक स्थान की आवश्यकता होगी (जैसे मापदंडों के बीच), सुनिश्चित करें स्थान को भी शामिल करने के लिए (या तो पहले ^, या अगली पंक्ति की शुरुआत में - वह बाद वाला विकल्प यह स्पष्ट करने में मदद कर सकता है कि यह एक निरंतरता है)।

उदाहरण: (सभी विंडोज़ एक्सपी और विंडोज 7 पर परीक्षण किए गए)

xcopy file1.txt file2.txt

के रूप में लिखा जा सकता है:

xcopy^
 file1.txt^
 file2.txt

या

xcopy ^
file1.txt ^
file2.txt

या और भी

xc^
opy ^
file1.txt ^
file2.txt

(पिछले काम करता है ऐसा इसलिए है क्योंकि betwen कोई रिक्त स्थान नहीं है xcऔर ^, और अगली पंक्ति की शुरुआत में कोई रिक्त स्थान। तो जब आप को दूर ^और न्यू लाइन, आप मिलता है ... xcopy।)

पठनीयता और पवित्रता के लिए, यह संभवतः केवल मापदंडों के बीच सबसे अच्छा ब्रेकिंग है (अंतरिक्ष को शामिल करना सुनिश्चित करें)।

सुनिश्चित करें कि हो सकता है ^है नहीं एक बैच फ़ाइल में आखिरी बात, वहाँ के रूप में उस के साथ एक प्रमुख मुद्दा हो गया लगता है


18

कई आदेशों को कोष्ठक में रखा जा सकता है और कई लाइनों में फैल सकता है; तो कुछ echo hi && echo helloइस तरह से रखा जा सकता है:

( echo hi
  echo hello )

इसके अलावा चर मदद कर सकते हैं:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

इसके अलावा, मैंने कैरेट्स ( ^) के साथ देखा कि ifसशर्त उन्हें पसंद करने के लिए केवल एक स्थान मौजूद था:

if exist ^

1
लाइन cmd1.bat && cmd2.batपैरेंस फॉर्म से अलग है: cmd2.batiff cmd1.batको सफलतापूर्वक निष्पादित किया गया है (-थाउट सेटिंग %errorcode%)। उत्तरार्द्ध रूप बिना शर्त निष्पादित करता है। कुछ अप्रत्याशित (मेरे लिए कम से कम) यह है कि, जाहिर है, आप दोनों के संयोजन का उपयोग नहीं कर सकते हैं + यानी &&लाइन ब्रेक से पहले जोड़ें ।
पॉल मिशालिक

( echo <line break here> hello )एक खाली लाइन में परिणाम।
कार्ल मॉरिसन

सबसे अच्छा और साफ जवाब! regex में
देखभाल

9

हालांकि यह लगता है कि पाश एक कैरट की जरूरत नहीं है के लिए एक के मूल्यों के बीच में बंटवारे (और वास्तव में एक सिंटैक्स त्रुटि पर विचार किया जाएगा उपयोग करने के लिए कोशिश कर रहा है)। उदाहरण के लिए,

for %n in (hello
bye) do echo %n

ध्यान दें कि नमस्ते के बाद या अलविदा से पहले किसी भी स्थान की आवश्यकता नहीं है।


बेशक, यह forवाक्य रचना का हिस्सा है : "फॉर-सेट" में तत्वों के विभाजक स्थान, अल्पविराम, अर्धविराम, समान-चिह्न, TAB चरित्र और नई-लाइनें हैं।
आकिनी

लेकिन क्या होगा यदि doभाग में कई / नेस्टेड if-elseस्टेटमेंट हों?
विक्की देव

फिर आप केवल विवरणों को संलग्न करने के लिए कोष्ठक का उपयोग कर सकते हैं जैसे% n इन (हेलो बाय) करते हैं (इको% n इको% n)
मोहम्मद सफ़वत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.