विंडोज कमांड लाइन पर बैच फ़ाइलों में मापदंडों का उपयोग करना


161

जब आप एक बैच फ़ाइल चलाते हैं, तो Windows में आप तर्कों का उपयोग कैसे करते हैं?

उदाहरण के लिए, मान लें कि मेरे पास एक प्रोग्राम है जिसका नाम है hello.bat। जब मैं hello -aएक विंडोज कमांड लाइन में प्रवेश करता हूं, तो मैं अपने प्रोग्राम को कैसे बताऊं कि -aएक तर्क के रूप में पारित किया गया था?


बैच फ़ाइल में कमांड लाइन पैरामीटर कैसे पास करें: stackoverflow.com/questions/26551/…
20:00 पर एरिक लेसचिंस्की

3
उन्होंने "डॉस कमांड लाइन" का उल्लेख किया।
डेविड आर ट्रिबल

जवाबों:


287

के रूप में दूसरों को पहले से ही कहा है, कमांड लाइन के माध्यम से पारित मापदंडों अंकन के साथ बैच फ़ाइलों में पहुँचा जा सकता है %1के लिए %9। दो अन्य टोकन भी हैं जिनका आप उपयोग कर सकते हैं:

  • %0है निष्पादन योग्य (बैच फ़ाइल) नाम कमांड लाइन में विनिर्दिष्ट
  • %*है सभी मापदंडों कमांड लाइन में निर्दिष्ट - यह बहुत उपयोगी है यदि आप किसी अन्य कार्यक्रम के लिए मानकों को अग्रेषित करने के लिए चाहते हैं।

मापदंडों का उपयोग करने के तरीके के अलावा जागरूक करने के लिए बहुत सारी महत्वपूर्ण तकनीकें भी हैं।

जाँच की जा रही है कि क्या एक पैरामीटर पारित किया गया था

यह ऐसे निर्माणों के साथ किया जाता है IF "%~1"=="", जो सच है अगर और केवल अगर कोई तर्क पारित नहीं किया गया था। टिल्ड चरित्र पर ध्यान दें जो किसी भी आसपास के उद्धरणों को मूल्य से हटा देता है %1; एक टिल्ड के बिना आपको अप्रत्याशित परिणाम प्राप्त होंगे यदि उस मूल्य में दोहरे उद्धरण शामिल हैं, जिसमें सिंटैक्स त्रुटियों की संभावना भी शामिल है।

9 से अधिक तर्कों को संभालना (या जीवन को आसान बनाना)

यदि आपको 9 से अधिक तर्कों का उपयोग करने की आवश्यकता है, तो आपको कमांड का उपयोग करना होगा SHIFT। यह आदेश बदलाव एक ही स्थान पर सभी तर्कों के मूल्यों, ताकि %0के मान लेता है %1, %1का मान लेता है %2, आदि %9दसवें तर्क के मान कॉल करने से पहले किसी भी चर के माध्यम से (यदि कोई मौजूद है) लेता है, जो उपलब्ध नहीं था SHIFT(दर्ज SHIFT /?अधिक विकल्पों के लिए कमांड )।

SHIFTयह तब भी उपयोगी है जब आप किसी विशिष्ट क्रम में प्रस्तुत किए बिना आवश्यक पैरामीटर को आसानी से संसाधित करना चाहते हैं। उदाहरण के लिए, एक स्क्रिप्ट झंडे -aऔर -bकिसी भी क्रम में पहचान सकती है । ऐसे मामलों में कमांड लाइन को पार्स करने का एक अच्छा तरीका है

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

यह योजना आपको पागल के बिना बहुत जटिल कमांड लाइनों को पार्स करने की अनुमति देती है।

बैच मापदंडों का प्रतिस्थापन

फ़ाइल नाम का प्रतिनिधित्व करने वाले मापदंडों के लिए शेल फाइलों के साथ काम करने से संबंधित बहुत सारी कार्यक्षमता प्रदान करता है जो किसी अन्य तरीके से सुलभ नहीं है। इस कार्यक्षमता को उन निर्माणों के साथ एक्सेस किया जाता है जो इसके साथ शुरू होते हैं %~

उदाहरण के लिए, फ़ाइल के आकार को तर्क उपयोग के रूप में पारित करने के लिए

ECHO %~z1

उस निर्देशिका का पथ प्राप्त करने के लिए जहां से बैच फ़ाइल लॉन्च की गई थी (बहुत उपयोगी!) आप उपयोग कर सकते हैं

ECHO %~dp0

CALL /?कमांड प्रॉम्प्ट में टाइप करके आप इन क्षमताओं की पूरी श्रृंखला देख सकते हैं ।


4
गोटे: यहां तक ​​कि पार्स, एंडपर्स निर्माण भी सौंदर्य है। धन्यवाद! (मेरा मतलब है, डॉस-बेसिक मजबूर गोटो)
एमएमआर्टेंट

1
BAT को पॉवरशेल से कॉल करने पर यह तकनीक विफल हो सकती है। एक उद्धृत तर्क जैसे निर्वासन के दौरान "name=John"बन जाएगा name John। एक वर्कअराउंड सिंगल कोट्स के साथ '"name=John"'
घेरना है

1
मैं इतने लंबे समय के बिना कैसे चले गए CALL /?!? यहाँ मैं पूरे समय Google के साथ घूम रहा हूँ।
bigtlb

@Jon I ने bat फ़ाइल लिखी है जिसमें केवल एक कोड इको% 1 है यदि मैं इसे cmd उदा xx.bat और पैरामीटर> "C: \ yy.txt" के माध्यम से कॉल करता हूँ, तो बैट फ़ाइल को पैरामीटर के साथ कॉल करके txt फ़ाइल में लिखता है, लेकिन यदि मैं & शुरुआत या अंत में पैरामीटर काम नहीं कर रहा है। कोई अन्य पाठ ठीक काम कर रहा है।
एलेक्स मैथ्यू

56

बैच फ़ाइलों में मापदंडों का उपयोग करना:% 0 और% 9

बैच फ़ाइलें टोकन के साथ पैरामीटर के रूप में पारित शब्दों को संदर्भित कर सकती हैं: %0से %9

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

कमांडलाइन पर दिए गए पैरामीटर अल्फ़ान्यूमेरिक वर्ण और रिक्त स्थान द्वारा सीमांकित होने चाहिए। चूंकि %0कार्यक्रम का नाम है जैसा कि यह कहा जाता था, %0अगर डॉस को AUTOEXEC.BAT के लिए खाली किया जाएगा यदि बूट समय पर शुरू किया गया है।

उदाहरण:

निम्नलिखित कमांड को एक बैच फ़ाइल में रखें mybatch.bat:

@echo off
@echo hello %1 %2
pause

बैच फ़ाइल को इस तरह शामिल करना: mybatch john billyआउटपुट होगा:

hello john billy

बैच फ़ाइल के लिए 9 से अधिक पैरामीटर प्राप्त करें, उपयोग करें:% *

प्रतिशत स्टार टोकन का %*अर्थ है "बाकी पैरामीटर"। आप उन्हें परिभाषित करने के लिए लूप के लिए उपयोग कर सकते हैं, जैसा कि यहाँ परिभाषित किया गया है:

http://www.robvanderwoude.com/parameters.php

बैच मापदंडों के लिए सीमांकक के बारे में नोट्स

कमांड लाइन के मापदंडों में कुछ वर्णों को DOS संस्करण के आधार पर बैच फ़ाइलों द्वारा अनदेखा किया जाता है, चाहे वे "बच गए" हों या नहीं, और अक्सर कमांड लाइन में उनके स्थान के आधार पर:

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored

5

बैच फ़ाइलें स्वचालित रूप से कार्यक्रम के बाद पाठ को तब तक पास करती हैं जब तक कि उन्हें असाइन करने के लिए चर हैं। वे भेजे गए क्रम में पारित किए जाते हैं; जैसे% 1 कार्यक्रम के बाद भेजा जाने वाला पहला तार होगा, आदि।

यदि आपके पास Hello.bat और सामग्री हैं:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

और आप कमांड के माध्यम से बैच को लागू करते हैं

hello.bat APERS241% दिनांक%

आपको यह संदेश वापस प्राप्त करना चाहिए:

हैलो, APERS241 इस बैच फ़ाइल को चलाने के लिए धन्यवाद (01/11/2013)


4

@ जॉन :parse/:endparse योजना एक शानदार शुरुआत है, और वह शुरुआती पास के लिए मेरी आभार है, लेकिन अगर आपको लगता है कि विंडोज टॉर्चर बैच सिस्टम आपको उस आसान को बंद कर देगा ... ठीक है, मेरे दोस्त, आप एक झटके में हैं। मैंने इस शैतानी के साथ पूरा दिन बिताया है, और बहुत दर्दनाक अनुसंधान और प्रयोग के बाद मैंने आखिरकार एक वास्तविक जीवन की उपयोगिता के लिए कुछ व्यवहार्य है।

हम कहते हैं कि हम एक उपयोगिता लागू करना चाहते हैं foobar। इसके लिए प्रारंभिक कमांड की आवश्यकता होती है। इसका एक वैकल्पिक पैरामीटर है --fooजो एक वैकल्पिक मूल्य लेता है (जो दूसरा पैरामीटर नहीं हो सकता है, निश्चित रूप से); अगर मूल्य याद आ रही है तो यह चूक है default। इसमें एक वैकल्पिक पैरामीटर भी है --barजो आवश्यक मूल्य लेता है । अंत में यह --bazबिना किसी अनुमति के एक ध्वज ले सकता है । ओह, और ये पैरामीटर किसी भी क्रम में आ सकते हैं।

दूसरे शब्दों में, यह इस तरह दिखता है:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

उलझा हुआ? नहीं, यह वास्तविक जीवन की उपयोगिताओं के लिए बहुत विशिष्ट लगता है। ( gitकोई भी?)

आगे की हलचल के बिना, यहाँ एक समाधान है:

@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson

SET CMD=%~1

IF "%CMD%" == "" (
  GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=

SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
  SHIFT
  IF NOT "%ARG%" == "" (
    IF NOT "%ARG:~0,2%" == "--" (
      SET FOO=%ARG%
      SHIFT
    ) ELSE (
      SET FOO=%DEFAULT_FOO%
    )
  ) ELSE (
    SET FOO=%DEFAULT_FOO%
  )
) ELSE IF "%PARAM%" == "--bar" (
  SHIFT
  IF NOT "%ARG%" == "" (
    SET BAR=%ARG%
    SHIFT
  ) ELSE (
    ECHO Missing bar value. 1>&2
    ECHO:
    GOTO usage
  )
) ELSE IF "%PARAM%" == "--baz" (
  SHIFT
  SET BAZ=true
) ELSE IF "%PARAM%" == "" (
  GOTO endargs
) ELSE (
  ECHO Unrecognized option %1. 1>&2
  ECHO:
  GOTO usage
)
GOTO args
:endargs

ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
  ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
  ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
  ECHO Baz
)

REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof

:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1

हाँ, यह सच है कि बुरा है। Https://stackoverflow.com/a/50653047/421049 पर मेरी इसी तरह की पोस्ट देखें , जहां मैं तर्क में क्या चल रहा है, और क्यों कुछ निर्माणों का उपयोग किया, इसका अधिक विश्लेषण प्रदान करता हूं।

घृणित। उस सबसे मुझे आज सीखना था। और यह चोट लगी है।


3

वैरिएबल यानी चरों का उपयोग करें .BATऔर इसे बुलाया %0जाए%9

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