windows मैं बैच फ़ाइल में कमांड लाइन पैरामीटर कैसे पास करूं?




batch-file command-line (11)

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

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

test.cmd admin [email protected] > test-log.txt

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

@echo off

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

echo copied %1 to %2

pause

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

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

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

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


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

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


यहां मैं यह कैसे करता हूं।

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

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

test.cmd admin [email protected] > test-log.txt

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


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

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

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


आइए इसे सरल रखें।

यहां .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>

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

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

कमांड लाइन में एक सेट वैरिएबल को संदर्भित करने के लिए आपको "% a%" का उपयोग करना होगा, उदाहरण के लिए:

      set a=100 
      echo %a%  
      output = 100 

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


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

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

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

इसके बारे में जानकारी है :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

एक और उपयोगी युक्ति है "सभी" का मतलब% * का उपयोग करना है। उदाहरण के लिए,

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 foo bar

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


बैच पैरामीटर एक्सेस करना% 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!'

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

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

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

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

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


मैंने एक साधारण 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=true उपयोग कर सकते हैं, लेकिन मैं उस समय से पहले पैरामीटर की सूची जानने के बिना रिक्त मूल्यों को अनुमति देने के तरीके के बारे में नहीं सोच सकता, जिसमें कोई मूल्य नहीं होगा।

बदलाव का

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




cmd