मैं एक बैच फ़ाइल में तर्क कैसे पास कर सकता हूं?


1165

मुझे फ़ाइल में हार्डकोड करने के बजाय चलने के समय एक बैच फ़ाइल में एक आईडी और एक पासवर्ड पारित करने की आवश्यकता है।

यहाँ कमांड लाइन कैसी दिखती है:

test.cmd admin P@55w0rd > test-log.txt

8
"शेष सभी" के लिए ग्रेग हेगिल की टिप्पणी को देखें कि कैसे एनटी स्थिति से बैच फ़ाइल पैरामीटर प्राप्त करें?
मैट विल्की

मेरे पास एक पर्यावरण स्टार्टअप स्क्रिप्ट है जो मेरे उपयोगकर्ता नाम / पासवर्ड को पर्यावरण चर में धकेल देगी ... ताकि मुझे हर बार उन्हें टाइप न करना पड़े ... मैं हालांकि अधिकांश समय का उपयोग कर रहा हूं (लिनक्स, मैक और विंडोज़), और काम के लिए स्क्रिप्ट आदि में प्रॉक्सी कॉन्फिग के लिए इसका उपयोग करने की आवश्यकता है।
ट्रैकर

जवाबों:


1032

एक और उपयोगी टिप का %*अर्थ है "सभी" का उपयोग करना। उदाहरण के लिए:

echo off
set arg1=%1
set arg2=%2
shift
shift
fake-command /u %arg1% /p %arg2% %*

जब आप दौड़ते हैं:

test-command admin password foo bar

उपरोक्त बैच फ़ाइल चलेगी:

fake-command /u admin /p password admin password foo bar

मेरे पास वाक्यविन्यास थोड़ा गलत हो सकता है, लेकिन यह सामान्य विचार है।


123
% * वास्तव में बदलाव की परवाह किए बिना सभी मापदंडों का विस्तार करता है। तो दो पारियों के बाद भी आपके पास पहले दो तर्क% * होंगे। आप कुछ इस तरह का उपयोग कर सकते हैं: stackoverflow.com/questions/761615/… एक वैरिएबल पाने के लिए जिसमें सब कुछ है लेकिन पहला n पैरामीटर।
जॉय

1
कृपया ध्यान दें कि% * हर जगह काम नहीं करता है! उदाहरण के लिए, यह डॉसबॉक्स 0.73 के साथ काम नहीं करता है (शायद यह एक बग है जिसे रिपोर्ट किया जाना चाहिए)।
डेनिलसन सिया मिया

28
यह बग नहीं है क्योंकि% * ने पहले स्थान पर MS-DOS या Win9x में कभी काम नहीं किया।
केफ शेक्टेर

मुझे लगता shiftहै कि सूची से तर्क "पॉप" करता है। ओपी द्वारा धारणा यह थी कि %*केवल शेष तर्कों का उत्पादन होगा, लेकिन यह उस तरह से काम नहीं करेगा, जैसा @ जॉय ने कहा।
नाथनअल्डनश्री

5
यह उत्तर गलत है। यह वास्तव में परिणाम है fake-command /u admin /p password admin password foo bar। यह @Joey द्वारा कई साल पहले बताया गया था।
jwdonahue

286

यहाँ मैंने यह कैसे किया:

@fake-command /u %1 /p %2

यहाँ क्या कमांड की तरह दिखता है:

test.cmd admin P@55w0rd > test-log.txt

%1पहले पैरामीटर पर लागू होता है %2(और यहाँ मुश्किल हिस्सा है) दूसरे पर लागू होता है। इस तरह से आपके पास अधिकतम 9 पैरामीटर हो सकते हैं।


16
यदि आप मेरे जैसे ही गूंगे हैं, तो आपका दिमाग ढूंढ रहा echo %1 %2था और नॉन कट-एंड-पास्टेनेबल सरलतम केस को ए @और परमस के साथ फेंक दिया गया था fake-command, यह सोचकर कि हमें fake-command.batबाद में सामग्री मिल जाएगी (किस मामले में) ओवरकम्प्लिकेटेड को परम नामों को अनदेखा करना fake-command.batपड़ सकता है echo %2 %4)। गलत, डूफस। TL; DR: मेरे जैसा गूंगा मत बनो। 1. echo echo %1 %2 > test.bat2 test word1 word2.। 3. लाभ।
रफिन

143

यदि आप समझदारी से लापता मापदंडों को संभालना चाहते हैं तो आप कुछ ऐसा कर सकते हैं:

IF %1.==. GOTO No1
IF %2.==. GOTO No2
... do stuff...
GOTO End1

:No1
  ECHO No param 1
GOTO End1
:No2
  ECHO No param 2
GOTO End1

:End1

2
इन समानता कार्यों में डॉट / अवधि का क्या महत्व है?
क्रिस

4
मूल रूप से यदि% 1 खाली है, तो यह IF होगा। ==। और इसलिए GOTO होगा। हम यहां x का उपयोग करते हैं: IF x% 1 == x -> IF x == x -> सत्य
कार्ल

1
आपको "अप्रतिष्ठित तर्क" का मूल्य क्या होना चाहिए? एक "अप्रमाणित तर्क" की जाँच करनी चाहिए जिसके खिलाफ आप हैं? फिर, यदि आपके पास कोई उत्तर नहीं है, तो आपको डॉट्स की तरह एक ट्रिक का उपयोग करना चाहिए। याद रखें कि, जैसा कि यहां बताया गया है ss64.com/nt/if.html "आप वास्तव में इस '~' या घुंघराले कोष्ठक, {} या यहां तक ​​कि संख्या 4 के लिए लगभग किसी भी वर्ण का उपयोग कर सकते हैं, लेकिन वर्ग कोष्ठक इसलिए चुना जाता है क्योंकि उनका कोई विशेष अर्थ नहीं है। "
एड्रियानो जीवी एस्पोसिटो

89

बैच पैरामीटर एक्सेस करना% 1,% 2, ...% 9 या% * के साथ सरल हो सकता है,
लेकिन केवल तभी जब सामग्री सरल हो।

जटिल सामग्रियों के लिए कोई सरल तरीका नहीं है "&"^&, जैसे कि त्रुटि उत्पन्न किए बिना% 1 तक पहुंचना संभव नहीं है।

set  var=%1
set "var=%1"
set  var=%~1
set "var=%~1"

रेखाओं का विस्तार होता है

set  var="&"&
set "var="&"&"
set  var="&"&
set "var="&"&"

और प्रत्येक पंक्ति विफल रहती है, जैसा &कि उद्धरणों में से एक है।

यह एक अस्थायी फ़ाइल से पैरामीटर के एक टिप्पणी किए गए संस्करण को पढ़ने के साथ हल किया जा सकता है ।

@echo off
SETLOCAL DisableDelayedExpansion

SETLOCAL
for %%a in (1) do (
    set "prompt="
    echo on
    for %%b in (1) do rem * #%1#
    @echo off
) > param.txt
ENDLOCAL

for /F "delims=" %%L in (param.txt) do (
  set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'

चाल echo onएक remबयान के बाद% 1 को सक्षम और विस्तारित करने के लिए है (साथ काम भी करता है %2 .. %*)।
यहां तक ​​कि "&"&एक त्रुटि पैदा किए बिना भी इसे प्रतिध्वनित किया जा सकता है, क्योंकि यह टिप्पणी की गई है।

लेकिन के उत्पादन को पुनर्निर्देशित करने में सक्षम होने के लिए echo on, आपको दो-छोरों की आवश्यकता है।

अतिरिक्त वर्णों * #का उपयोग सामग्री के विरुद्ध सुरक्षित करने के लिए किया जाता है /?( जैसे मदद दिखाएगा REM)।
या लाइन के अंत में एक कैरेट ^ बहु-चरित्र के रूप में काम कर सकता है, एक के बाद भी rem

फिर फ़ाइल से रेम पैरामीटर आउटपुट पढ़ना , लेकिन ध्यान से।
FOR / F को विलंबित विस्तार के साथ काम करना चाहिए, बाकी सामग्री "!" नष्ट हो जाएगा।
अतिरिक्त वर्णों को निकालने के बाद param1, आपको मिल गया।

और param1सुरक्षित तरीके से उपयोग करने के लिए, विलंबित विस्तार को सक्षम करें।


For / F "tokens = *" %% a ('echo% *') do "all_args = %% a" सेट करें
केविन एडवर्ड्स

@ केविनएडवर्ड्स इसके बाद इसे एक के साथ आज़माएं &, आपका समाधान केवल साधारण सामग्री के साथ काम करता है
जेबी

@ केविनएडवर्ड्स मैंने इसका परीक्षण किया, test.bat ^&और यह विफल हो गया। केवल test.bat "&"काम करता है, लेकिन यह मेरी बात नहीं थी। आप उपयोग नहीं कर सकते %*, %1रेम कलाओं के बिना एक सुरक्षित तरीका में
जेब

आह, हाँ, एक कैरेट इसे ठीक से नहीं बचता है। आपको उद्धरणों की आवश्यकता है, जो मेरे द्वारा उपयोग किए गए सभी मामलों के लिए संभव है। मैं बस इसे पास करना चाहता था। इसका परीक्षण करने के लिए धन्यवाद! चीयर्स :)
केविन एडवर्ड्स

2
@jwdonahue हाँ, यह जटिल है (लेकिन जटिल नहीं है)। लेकिन विशेष रूप से पासवर्ड के लिए यह आवश्यक हो सकता है, कम से कम मेरे कुछ पासवर्डों में एम्परसेंड &और भी उद्धरण हैं"
जेब

59

हां, और %%1जब उपयोग करना ifऔर forगैंग जैसे चर का उपयोग करना न भूलें ।

यदि आप डबल भूल जाते हैं %, तो आप (संभवतः नल) कमांड लाइन के तर्कों में प्रतिस्थापित हो जाएंगे और आपको कुछ सुंदर त्रुटि संदेश प्राप्त होंगे।


%% केवल ifऔर के लिए है for?
रॉय नमिर

25
यह इससे भी बदतर है - %% का उपयोग बैच फ़ाइलों के अंदर चर और कमांड लाइन मापदंडों को उपसर्ग करने के लिए किया जाता है । लेकिन जब आप कमांड लाइन से इन कमांड का उपयोग करते हैं, तो आप उपसर्ग के लिए केवल% का उपयोग करते हैं। उदाहरण: बैच के अंदर: for %%d in (*) do echo %%dकमांड लाइन से:for %d in (*) do echo %d
स्टीव मिडगले

11
@SteveMidgley मैंने एक या एक साल पहले आपकी टिप्पणी को गलत ठहराया था। फिर मैं तुरंत इसके बारे में भूल गया और आज ही मैं कोशिश कर रहा था और कमांड लाइन में लूप के लिए भ्रमित होकर घूर रहा था और सोच रहा था कि यह क्यों फार्ट किया और कुछ नहीं किया। तो यहाँ एक और आभासी मुझ से है। मैं एक और साल में वापस आऊंगा या जब मैं एक ही मुद्दे को फिर से मारूंगा।
icc97

हम आमतौर पर कमांड लाइन प्रसंस्करण के लिए अंकों को आरक्षित करते हैं और दोहरा प्रतिशत केवल कथन के लिए लागू होता है जहां तक ​​मुझे पता है। @for %%2 in (testing) do @echo %%2 %1एक बैच फ़ाइल में, testing 1तब उत्पन्न होता है जब इसे 1 ( test 1) के साथ कहा जाता है ।
jwdonahue

2
उत्तर गलत है। %%1कमांड लाइन तर्क तक पहुँच नहीं है, और यह IFकमांड के लिए भी गलत है । केवल FORकमांड (बैच फ़ाइलों में) को डबल पर्केंट्स की आवश्यकता होती है, लेकिन तब भी %%1एक पैरामीटर को परिभाषित करेगा और तर्कों तक नहीं
पहुंचेगा

51

इसे जटिल करने की कोई आवश्यकता नहीं है। यह केवल कमांड% 1% 2 पैरामीटर है, उदाहरण के लिए,

@echo off

xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z

echo copied %1 to %2

pause

"विराम" प्रदर्शित करता है कि बैच फ़ाइल ने क्या किया है और किसी भी कुंजी को हिट करने के लिए आपकी प्रतीक्षा करता है। Windows फ़ोल्डर में xx.bat के रूप में सहेजें।

इसका उपयोग करने के लिए, उदाहरण के लिए, टाइप करें:

xx c:\f\30\*.* f:\sites\30

यह बैच फ़ाइल सभी आवश्यक मापदंडों का ध्यान रखती है, जैसे केवल फाइलें कॉपी करना, जो कि नई हैं, आदि। मैंने विंडोज से पहले इसका उपयोग किया है। यदि आप फ़ाइलों के नाम देखना पसंद करते हैं, जैसा कि वे कॉपी किए जा रहे हैं, तो Qपैरामीटर को छोड़ दें ।


41

एक मित्र मुझसे हाल ही में इस विषय के बारे में पूछ रहा था, इसलिए मैंने सोचा कि मैं पोस्ट फ़ाइलों में कमांड-लाइन तर्कों को कैसे संभालूँ।

इस तकनीक में कुछ हद तक ओवरहेड होता है जैसा कि आप देखेंगे, लेकिन यह मेरे बैच फ़ाइलों को समझने में बहुत आसान है और लागू करने के लिए त्वरित है। साथ ही निम्नलिखित संरचनाओं का समर्थन कर रहा है:

>template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...]

यह के jist चल रहा है :init, :parseऔर :mainकाम करता है।

उदाहरण उपयोग

>template.bat /?
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

USAGE:
test.bat [flags] "required argument" "optional argument"

/?, --help           shows this help
/v, --version        shows the version
/e, --verbose        shows detailed output
-f, --flag value     specifies a named parameter value

>template.bat          <- throws missing argument error
(same as /?, plus..)
****                                   ****
****    MISSING "REQUIRED ARGUMENT"    ****
****                                   ****

>template.bat -v
1.23

>template.bat --version
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

>template.bat -e arg1
**** DEBUG IS ON
UnNamedArgument:    "arg1"
UnNamedOptionalArg: not provided
NamedFlag:          not provided

>template.bat --flag "my flag" arg1 arg2
UnNamedArgument:    "arg1"
UnNamedOptionalArg: "arg2"
NamedFlag:          "my flag"

>template.bat --verbose "argument #1" --flag "my flag" second
**** DEBUG IS ON
UnNamedArgument:    "argument #1"
UnNamedOptionalArg: "second"
NamedFlag:          "my flag"

template.bat

@::!/dos/rocks
@echo off
goto :init

:header
    echo %__NAME% v%__VERSION%
    echo This is a sample batch file template,
    echo providing command-line arguments and flags.
    echo.
    goto :eof

:usage
    echo USAGE:
    echo   %__BAT_NAME% [flags] "required argument" "optional argument" 
    echo.
    echo.  /?, --help           shows this help
    echo.  /v, --version        shows the version
    echo.  /e, --verbose        shows detailed output
    echo.  -f, --flag value     specifies a named parameter value
    goto :eof

:version
    if "%~1"=="full" call :header & goto :eof
    echo %__VERSION%
    goto :eof

:missing_argument
    call :header
    call :usage
    echo.
    echo ****                                   ****
    echo ****    MISSING "REQUIRED ARGUMENT"    ****
    echo ****                                   ****
    echo.
    goto :eof

:init
    set "__NAME=%~n0"
    set "__VERSION=1.23"
    set "__YEAR=2017"

    set "__BAT_FILE=%~0"
    set "__BAT_PATH=%~dp0"
    set "__BAT_NAME=%~nx0"

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedOptionalArg="
    set "NamedFlag="

:parse
    if "%~1"=="" goto :validate

    if /i "%~1"=="/?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="-?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="--help"     call :header & call :usage "%~2" & goto :end

    if /i "%~1"=="/v"         call :version      & goto :end
    if /i "%~1"=="-v"         call :version      & goto :end
    if /i "%~1"=="--version"  call :version full & goto :end

    if /i "%~1"=="/e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="-e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="--verbose"  set "OptVerbose=yes"  & shift & goto :parse

    if /i "%~1"=="--flag"     set "NamedFlag=%~2"   & shift & shift & goto :parse

    if not defined UnNamedArgument     set "UnNamedArgument=%~1"     & shift & goto :parse
    if not defined UnNamedOptionalArg  set "UnNamedOptionalArg=%~1"  & shift & goto :parse

    shift
    goto :parse

:validate
    if not defined UnNamedArgument call :missing_argument & goto :end

:main
    if defined OptVerbose (
        echo **** DEBUG IS ON
    )

    echo UnNamedArgument:    "%UnNamedArgument%"

    if defined UnNamedOptionalArg      echo UnNamedOptionalArg: "%UnNamedOptionalArg%"
    if not defined UnNamedOptionalArg  echo UnNamedOptionalArg: not provided

    if defined NamedFlag               echo NamedFlag:          "%NamedFlag%"
    if not defined NamedFlag           echo NamedFlag:          not provided

:end
    call :cleanup
    exit /B

:cleanup
    REM The cleanup function is only really necessary if you
    REM are _not_ using SETLOCAL.
    set "__NAME="
    set "__VERSION="
    set "__YEAR="

    set "__BAT_FILE="
    set "__BAT_PATH="
    set "__BAT_NAME="

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedArgument2="
    set "NamedFlag="

    goto :eof

32
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

नोट: यदि उद्धरण में ही संलग्न है "%1"==""तो IF समस्याएँ पैदा करेगा %1

उस स्थिति में, IF [%1]==[]NT 4 (SP6) में या बाद में, IF "%~1"==""इसके बजाय , का उपयोग करें या ।


यह सच है, लेकिन यह मुश्किल से विषय को छूता है।
jwdonahue

22

चलिए इसे सरल रखते हैं।

यहाँ .cmd फ़ाइल है।

@echo off
rem this file is named echo_3params.cmd
echo %1
echo %2
echo %3
set v1=%1
set v2=%2
set v3=%3
echo v1 equals %v1%
echo v2 equals %v2%
echo v3 equals %v3%

यहां कमांड लाइन से 3 कॉल हैं।

C:\Users\joeco>echo_3params 1abc 2 def  3 ghi
1abc
2
def
v1 equals 1abc
v2 equals 2
v3 equals def

C:\Users\joeco>echo_3params 1abc "2 def"  "3 ghi"
1abc
"2 def"
"3 ghi"
v1 equals 1abc
v2 equals "2 def"
v3 equals "3 ghi"

C:\Users\joeco>echo_3params 1abc '2 def'  "3 ghi"
1abc
'2
def'
v1 equals 1abc
v2 equals '2
v3 equals def'

C:\Users\joeco>

20
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

यह बैच पैरामीटर (% *) पर लूप करता है या तो वे उद्धृत किए जाते हैं या नहीं, फिर प्रत्येक पैरामीटर इकोस।


लेकिन जैसे कई अलग अलग तर्क के साथ विफल रहता है, test.bat *.txt, test.bat cat^&dogयाTest.bat /?
जेब

19

मैंने एक सरल read_params स्क्रिप्ट लिखी है जिसे एक फ़ंक्शन (या बाहरी .bat) के रूप में कहा जा सकता है और वर्तमान परिवेश में सभी चर डाल देगा। यह मूल मापदंडों को संशोधित नहीं करेगा क्योंकि मूल मापदंडों की callएक प्रतिलिपि के साथ फ़ंक्शन संपादित किया जा रहा है ।

उदाहरण के लिए, निम्नलिखित आदेश दिए गए हैं:

myscript.bat some -random=43 extra -greeting="hello world" fluff

myscript.bat फ़ंक्शन को कॉल करने के बाद चर का उपयोग करने में सक्षम होगा:

call :read_params %*

echo %random%
echo %greeting%

यहाँ समारोह है:

:read_params
if not %1/==/ (
    if not "%__var%"=="" (
        if not "%__var:~0,1%"=="-" (
            endlocal
            goto read_params
        )
        endlocal & set %__var:~1%=%~1
    ) else (
        setlocal & set __var=%~1
    )
    shift
    goto read_params
)
exit /B

सीमाएं

  • कोई मान जैसे तर्क को लोड नहीं कर सकता -force। आप उपयोग कर सकते हैं, -force=trueलेकिन मैं समय से पहले मापदंडों की एक सूची को जानने के बिना रिक्त मानों को अनुमति देने के तरीके के बारे में सोच भी नहीं सकता जिसका मूल्य नहीं होगा।

बदलाव का

  • 2016/02/18
    • अब विलंबित विस्तार की आवश्यकता नहीं है
    • अब -मापदंडों से पहले की तलाश में अन्य कमांड लाइन तर्कों के साथ काम करता है ।

इस पद्धति का उपयोग करते हुए देख रहा हूं क्योंकि मैं इस तरीके से एक बैच फ़ाइल में तर्क पारित करना चाहता हूं। हालाँकि, मैंने देखा कि चरों के सेट होने के बाद भी, बैच फ़ाइल से बाहर निकलने के बाद भी मापदंडों को cmd में सेट किया गया है यदि पहुँचा और बैच समाप्त हो गया है, तो वे अपने पिछले राज्य में पुनर्स्थापित नहीं होते हैं। क्या इस विधि को उस स्थिति को संभालना चाहिए?
जोनो_2007

विषय पर और इस थ्रेड पर बाकी उत्तरों में से कुछ से बेहतर।
jwdonahue

इसे फ़्लैग आर्ग्स (मानों के बिना) का समर्थन करने के लिए विस्तारित किया गया। फ़ॉर्मेटिंग की कमी के लिए खेद है, लेकिन यह टिप्पणियों में काम नहीं करता है: read_params यदि% 1 / == / (यदि नहीं "% __ var%" == "" (यदि नहीं "% __ var: ~ 0,1%" == "-" (एंडलोकल गोटो रीड_परम) एंडलोकल और सेट% __ var: ~ 1% =% ~ 1) और (सेट्लोकल और सेट __var =% ~ 1) शिफ्ट गोटो रीड_परम) और (यदि "% __ var%" == "" "" (एंडलोकल एंड सेट% __ var: ~ 1% = 1))
अधिकतम

13

बैच फ़ाइल में

set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%

% 1 और% 2 क्रमशः पहले और दूसरे तर्क मान लौटाते हैं।

और कमांड लाइन में, बहस को पास करें

Directory> batchFileName admin P@55w0rd 

आउटपुट होगा

admin
P@55w0rd

9

कमांड लाइन में एक सेट चर का उल्लेख करने के %a%लिए आपको उदाहरण के लिए इसका उपयोग करने की आवश्यकता होगी :

set a=100 
echo %a%  
rem output = 100 

नोट: यह विंडोज 7 प्रो के लिए काम करता है।


6

@ जोन द्वारा कहीं और एक उत्तर से प्रेरित होकर , मैंने नामांकित मापदंडों, वैकल्पिक मूल्यों और स्विच को निकालने के लिए एक अधिक सामान्य एल्गोरिदम तैयार किया है।

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

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

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

यहाँ एक समाधान है:

@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
  • उपयोग करें SETLOCALताकि चर कॉलिंग वातावरण में बच न जाएं।
  • वैरिएबल को इनिशियलाइज़ करना न भूलें SET FOO=, अगर कोई उन्हें कॉलिंग के माहौल में परिभाषित करता है।
  • %~1उद्धरण हटाने के लिए उपयोग करें ।
  • उपयोग करें IF "%ARG%" == ""और न करें IF [%ARG%] == []क्योंकि एक स्थान पर समाप्त होने वाले मूल्यों के साथ खेलना [और ]खेलना बिल्कुल नहीं होगा।
  • यहां तक ​​कि अगर आप SHIFTकिसी IFब्लॉक के अंदर हैं , तो भी वर्तमान आर्गन्स %~1अपडेट नहीं होते हैं क्योंकि वे निर्धारित किए जाते हैं जब IFपार्स किया जाता है। आप ब्लॉक का उपयोग कर सकते हैं %~1और %~2अंदर कर सकते हैं IF, लेकिन यह भ्रामक होगा क्योंकि आपके पास ए SHIFT। आप SHIFTस्पष्टता के लिए ब्लॉक के अंत में रख सकते हैं , लेकिन वह खो सकता है और / या लोगों को भ्रमित कर सकता है। इसलिए "कैप्चरिंग" %~1और %~1ब्लॉक के बाहर सबसे अच्छा लगता है।
  • आप किसी अन्य पैरामीटर्स के वैकल्पिक मान के स्थान पर एक पैरामीटर का उपयोग नहीं करना चाहते हैं, इसलिए आपको जांचना होगा IF NOT "%ARG:~0,2%" == "--"
  • केवल तभी सावधान रहें SHIFTजब आप किसी एक पैरामीटर का उपयोग करते हैं।
  • डुप्लिकेट कोड SET FOO=%DEFAULT_FOO%अफसोसजनक है, लेकिन इसका विकल्प ब्लॉक के IF "%FOO%" == "" SET FOO=%DEFAULT_FOO%बाहर जोड़ना होगा IF NOT "%ARG%" == ""। हालांकि, क्योंकि इस के अंदर अभी भी है IF "%PARAM%" == "--foo"ब्लॉक, %FOO%मूल्य मूल्यांकन किया गया है जाएगा और इससे पहले कि आप कभी ब्लॉक में प्रवेश निर्धारित करते हैं, तो आप पता लगाने कभी नहीं होगा कि दोनों--foo पैरामीटर मौजूद थे और यह भी कि %FOO%मूल्य याद आ रही थी।
  • ध्यान दें कि ECHO Missing bar value. 1>&2त्रुटि संदेश को stderr पर भेजता है।
  • Windows बैच फ़ाइल में रिक्त पंक्ति चाहते हैं? आप उपयोग ECHO:या विभिन्नताओं में से एक होगा ।

4

एक नया बैच फ़ाइल बनाएं (उदाहरण: openclass.bat) और इस पंक्ति को फ़ाइल में लिखें:

java %~n1

फिर बैच फ़ाइल को अंदर आने दें, सिस्टम32 फ़ोल्डर, अपनी जावा क्लास फ़ाइल पर जाएँ, राइट क्लिक करें, प्रॉपर्टीज़, साथ खोलें ..., फिर अपनी बैच फ़ाइल ढूंढें, इसे चुनें और वह ...

इससे मेरा काम बनता है।

PS: जब मैं जावा क्लास को बंद करता हूं तो मुझे cmd विंडो बंद करने का कोई तरीका नहीं मिलता। अभी के लिए...


बैच स्क्रिप्ट में निम्न कमांड का उपयोग करके प्रक्रिया बंद करने के बाद आप cmd विंडो को बंद कर सकते हैं:start /wait java %~n1
Paint_Ninja

1
System32 डायरेक्टरी में रैंडम स्क्रिप्ट फ़ाइलों को रखने के लिए जनता को सलाह देना गैर-जिम्मेदाराना है। यह उत्तर वास्तव में इस धागे के विषय की सतह को खरोंच नहीं करता है।
jwdonahue

2

सरल समाधान (भले ही प्रश्न पुराना हो)

Test1.bat

echo off
echo "Batch started"
set arg1=%1
echo "arg1 is %arg1%"
echo on
pause

CallTest1.bat

call "C:\Temp\Test1.bat" pass123

उत्पादन

YourLocalPath>call "C:\Temp\test.bat" pass123

YourLocalPath>echo off
"Batch started"
"arg1 is pass123"

YourLocalPath>pause
Press any key to continue . . .

जहां YourLocalPath वर्तमान निर्देशिका पथ है।

चीजों को सरल रखने के लिए कमांड परम को चर में रखें और तुलना के लिए चर का उपयोग करें।

यह न केवल लिखने के लिए सरल है बल्कि इसके सरल बनाए रखने के लिए भी है, इसलिए यदि बाद में किसी अन्य व्यक्ति या आप लंबे समय के बाद अपनी स्क्रिप्ट पढ़ते हैं, तो इसे समझना और बनाए रखना आसान होगा।

कोड इनलाइन लिखने के लिए: अन्य उत्तर देखें।


2

यहां छवि विवरण दर्ज करें

लूपिंग का उपयोग करने के लिए सभी तर्क प्राप्त करें और शुद्ध बैच में:

अवलोकन: बिना उपयोग के लिए:?*&<>


@echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && (
     call set "_arg_[!_cnt!]=!_arg_!" && for /l %%l in (!_cnt! 1 !_cnt!
     )do echo/ The argument n:%%l is: !_arg_[%%l]!
 )

goto :eof 

आपका कोड तर्क संख्या के साथ कुछ करने के लिए तैयार है जहाँ उसे ज़रूरत है, जैसे ...

 @echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && call set "_arg_[!_cnt!]=!_arg_!"
 )

 fake-command /u !_arg_[1]! /p !_arg_[2]! > test-log.txt

1
लेकिन यह विफल हो जाता है, जब पासवर्ड में कोई भी चरित्र होता है?*&<>
jeb

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