කණ්ඩායම් ගොනුවකට තර්ක ඉදිරිපත් කරන්නේ කෙසේද?


1177

හැඳුනුම්පතක් සහ මුරපදයක් ගොනු ගොනුවකට තදින් කේත කිරීමට වඩා ධාවනය වන අවස්ථාවේදී ලබා දිය යුතුය.

විධාන රේඛාවේ පෙනුම මෙන්න:

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

8
“ඉතිරි සියල්ල” සඳහා ග්‍රෙග් හෙගිල්ගේ ප්‍රකාශය බලන්න NTH ස්ථානයේ සිට කණ්ඩායම් ගොනු පරාමිතීන් ලබා ගන්නේ කෙසේද?
matt wilkie

මගේ පරිශීලක නාමය / මුරපදය පරිසර විචල්‍යයන් වෙතට තල්ලු කරන පරිසර ආරම්භක ස්ක්‍රිප්ටයක් මා සතුව ඇත ... එබැවින් ඒවා සෑම අවස්ථාවකදීම ටයිප් කිරීමට මට අවශ්‍ය නැත ... මම බොහෝ විට බාෂ් භාවිතා කරමි (ලිනක්ස්, මැක් සහ කවුළු), සහ වැඩ සඳහා ස්ක්‍රිප්ට් ආදියෙහි ප්‍රොක්සි වින්‍යාසය සඳහා එය භාවිතා කළ යුතුය.
ට්රැකර් 1

Answers:


1038

තවත් ප්‍රයෝජනවත් ඉඟියක් නම් %*“සියල්ල” යන්නෙහි තේරුමයි. උදාහරණයක් වශයෙන්:

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

මට වාක්‍ය ඛණ්ඩය තරමක් වැරදියි, නමුත් මෙය සාමාන්‍ය අදහසයි.


125
මාරුව නොතකා% * සැබවින්ම සියලු පරාමිතීන් දක්වා පුළුල් වේ. එබැවින් මාරුවීම් දෙකෙන් පසුව වුවද ඔබට තවමත් පළමු තර්ක දෙක% * හි ඇත. පළමු n පරාමිතීන් හැර අනෙක් සියල්ල අඩංගු විචල්‍යයක් ලබා ගැනීමට ඔබට මේ වගේ දෙයක් භාවිතා කළ හැකිය: stackoverflow.com/questions/761615/… .
ජෝයි

1
% * සෑම තැනකම ක්‍රියා නොකරන බව කරුණාවෙන් සලකන්න! උදාහරණයක් ලෙස, එය ඩොස්බොක්ස් 0.73 සමඟ ක්‍රියා නොකරයි (සමහර විට මෙය වාර්තා කළ යුතු දෝෂයකි).
ඩෙනිල්සන් එස් මායා

28
% * කිසි විටෙකත් MS-DOS හෝ Win9x හි වැඩ නොකළ නිසා එය දෝෂයක් නොවේ.
කෙෆ් ෂෙක්ටර්

මම හිතන්නේ shiftලැයිස්තුවෙන් තර්කය "මතු වේ". OP විසින් උපකල්පනය කරන ලද්දේ %*එය ඉතිරි තර්ක විතර්ක කිරීම පමණක් වන නමුත් @ ජෝයි පැවසූ පරිදි එය එසේ නොවේ.
NathanAldenSr

5
මෙම පිළිතුර වැරදිය. එය සැබවින්ම ප්‍රති results ලයකි fake-command /u admin /p password admin password foo bar. මීට වසර ගණනාවකට පෙර @ ජෝයි විසින් මෙය පෙන්වා දෙන ලදී.
jwdonahue

287

මෙන්න මම එය කළ ආකාරය:

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

මෙන්න විධානය පෙනෙන්නේ:

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

මෙම %1පළමු පරාමිතිය අදාළ වන %2(සහ මෙහි ගැටලුව නිරාකරණය කොටසක්) දෙවන වලට අදාළ වේ. ඔබට මේ ආකාරයෙන් පරාමිති 9 ක් දක්වා සම්මත කළ හැකිය.


16
ඔබ මා තරම් ගොළු නම්, ඔබේ මනස සොයමින් සිටි echo %1 %2අතර, කපන ලද හා ඇලවිය නොහැකි සරලම නඩුව a @සහ a fake-commandපරාමිතීන් සමඟ ඉවත දැමීය, අපට fake-command.batපසුව අන්තර්ගතය ලැබෙනු ඇතැයි සිතමින් (එවැනි අවස්ථාවක, overcomplicated fake-command.batතිබිය හැකිය echo %2 %4) එම param නම් නොසලකා. වැරදි, ඩූෆස්. ටීඑල්; ඩීආර්: මා තරම් ගොළු නොවන්න. 1. echo echo %1 %2 > test.bat2 test word1 word2.. 3. ලාභය.
රෆින්

අවුරුදු පහකට පසු, මම නැවත මගේ අදහස කියවීම අවුල් සහගතය. "පරාමිති දෙකක් සහිත .bat එකක් නිර්මාණය කිරීම, වචනාර්ථයෙන් ටයිප් කිරීම" යනුවෙන් අදහස් කර ඇති බව පෙනේecho echo %1 %2 > test.bat . Test.bat ගොනුව එහි ඇත echo %1 %2(ඔබට එය පෙළ සංස්කාරකයකින්ද ඉතිරි කර ගත හැකිය). දැන් test word1 word2ඇමතීමට ටයිප් කර වැඩ කළ පරාමිතීන් බලන්න. word1 word2විධාන රේඛාවට දෝංකාර දෙනු ඇත. ( echo %2 %4නොසලකා හරිනු ඇත /u, /pඑම නිසා ඔබට test /u word1 /p word2එම @
ප්‍රති result ලයම

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 -> true
කාල්

1
“අනුමත නොකළ තර්කයක” වටිනාකම කුමක්දැයි ඔබ විමසිය යුතුය. ඔබ “අනුමත නොකළ තර්කයක්” පරීක්ෂා කළ යුතු දේට එරෙහිව? එවිට, ඔබට පිළිතුරක් නොමැති නම්, ඔබ තිත් වලින් එකක් වැනි උපක්‍රමයක් භාවිතා කළ යුතුය. මෙහි සඳහන් කර ඇති පරිදි ss64.com/nt/if.html “ඇත්ත වශයෙන්ම ඔබට මේ සඳහා ඕනෑම චරිතයක් පාහේ '~' හෝ කැරලි වරහන්,}} හෝ අංක 4 සඳහා භාවිතා කළ හැකි බව මතක තබා ගන්න , නමුත් වර්ග වරහන් තෝරා ගැනීමට නැඹුරු වන නිසා ඔවුන්ට විශේෂ අර්ථයක් නැත.
ඇඩ්‍රියානෝ ජීවී එස්පොසිටෝ

90

කණ්ඩායම් පරාමිතීන් වෙත ප්‍රවේශ වීම% 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පසු% 1 සක්‍රීය කිරීම සහ පුළුල් කිරීමයි rem(එය සමඟ ද ක්‍රියා කරයි%2 .. %* ).
එබැවින් "&"&දෝෂයක් ඇති නොකර එය දෝංකාර දිය හැකිය.

නමුත් ප්‍රතිදානය නැවත හරවා යැවීමට echo onඔබට ලූප දෙකක් අවශ්‍ය වේ.

වැනි අමතර * #අන්තර්ගතයන් ආරක්‍ෂිත වීමට භාවිතා කරයි /?(ඒ සඳහා උපකාර පෙන්වනු ඇත REM).
නැතහොත් රේඛා කෙළවරේ ඇති කරත්තයක් a ට පසුව වුවද බහු අක්ෂර චරිතයක් ලෙස ක්‍රියා කළ හැකිය rem.

ඉන්පසු ගොනුවෙන් rem පරාමිති ප්‍රතිදානය කියවීම , නමුත් ප්‍රවේශමෙන්.
FOR / F ප්‍රමාද විය හැකි ප්‍රසාරණය සමඟ ක්‍රියා කළ යුතුය, නැතිනම් "!" විනාශ වේවි.
තුළ ඇති අමතර අක්ෂර ඉවත් කිරීමෙන් පසුවparam1 , ඔබට එය ලැබුණි.

param1ආරක්ෂිත ආකාරයකින් භාවිතා කිරීමට, ප්‍රමාද වූ ප්‍රසාරණය සක්‍රීය කරන්න.


/ F "ටෝකන සඳහා = *" %% a ('echo% *') "all_args = %% a" සකසන්න
කෙවින් එඩ්වර්ඩ්ස්

1
E කෙවින් එඩ්වර්ඩ්ස් ඉන්පසු එකක් සමඟ එය උත්සාහ කරන්න &, ඔබේ විසඳුම ක්‍රියාත්මක වන්නේ සරල අන්තර්ගතයකින් පමණි
jeb

1
E කෙවින් එඩ්වර්ඩ්ස් මම එය පරීක්ෂා කළ test.bat ^&අතර එය අසාර්ථක වේ. test.bat "&"වැඩ කරන්නේ පමණයි , නමුත් එය මගේ අදහස නොවේ. ඔබ භාවිතා කළ නොහැකි %*, %1අත්යාවශ්ය technic තොරව ආරක්ෂිත ආකාරයෙන්
jeb

ආහ්, ඔව්, කරත්තයක් නිසි ලෙස එයින් ගැලවෙන්නේ නැත. ඔබට උපුටා දැක්වීම් අවශ්‍යය, එය මා හමු වී ඇති සියලුම භාවිත අවස්ථා සඳහා කළ හැකි ය. මට අවශ්‍ය වූයේ එය පසුකර යාමටයි. එය පරීක්ෂා කිරීමට ස්තූතියි! චියර්ස් :)
කෙවින් එඩ්වර්ඩ්ස්

2
wjwdonahue ඔව්, එය සංකීර්ණයි (නමුත් සංකීර්ණ නොවේ). නමුත් විශේෂයෙන් මුරපද සඳහා එය අවශ්‍ය විය හැකිය, අවම වශයෙන් මගේ මුරපද සමහරක් ඇම්පියර්සෑන්ඩ් &සහ උපුටා දැක්වීම් අඩංගු වේ "
jeb

59

ඔව්, හා වගේ විචල්යයන් භාවිතා කිරීමට අමතක කරන්න එපා %%1භාවිතා කරන විට ifහා forකල්ලිය හා.

ඔබට දෙගුණයක් අමතක වුවහොත්, ඔබ %විධාන රේඛා තර්ක වෙනුවට ආදේශ කරනු ඇති අතර ඔබට ව්‍යාකූල දෝෂ පණිවිඩ ලැබෙනු ඇත.


%% පමණක් ifසහ for?
රෝයි නමීර්

25
එය ඊට වඩා නරක ය - කණ්ඩායම් ලිපිගොනු තුළ විචල්‍යයන් සහ විධාන රේඛා පරාමිතීන් උපසර්ග කිරීමට %% භාවිතා කරයි . නමුත් ඔබ විධාන රේඛාවෙන් මෙම විධානයන් භාවිතා කරන විට, ඔබ උපසර්ගය සඳහා භාවිතා කරන්නේ% පමණි. උදාහරණය: ඇතුළත කණ්ඩායම: for %%d in (*) do echo %%dවිධාන රේඛාවෙන්:for %d in (*) do echo %d
ස්ටීව් මිඩ්ග්ලි

11
Te ස්ටීව්මිඩ්ග්ලි මම ඔබේ අදහස බොහෝ විට වසරකට හෝ ඊට පෙර ඉදිරිපත් කළෙමි. මට එකවරම ඒ ගැන අමතක වූ අතර අද මම විධාන රේඛාවේ ලූපයක් සඳහා මගේ ව්‍යාකූලත්වය දෙස බලා සිටිමි. ඉතින් මෙන්න මගෙන් තවත් අතථ්‍ය උඩු යටිකුරු කිරීමක්. මම නැවත එම ප්‍රශ්නයටම මුහුණ දුන් විට තවත් වසරකින් හෝ නැවත පැමිණෙන්නෙමි.
icc97

අපි සාමාන්‍යයෙන් විධාන රේඛා සැකසුම් සඳහා ඉලක්කම් වෙන් කර ඇති අතර ද්විත්ව ප්‍රතිශතය අදාළ වන්නේ මා දන්නා පරිදි ප්‍රකාශය සඳහා පමණි. @for %%2 in (testing) do @echo %%2 %1කණ්ඩායම් ගොනුවක, testing 1එය 1 ( test 1) සමඟ කැඳවූ විට නිපදවයි .
jwdonahue

2
පිළිතුර වැරදියි. %%1විධාන රේඛා තර්කයකට ප්‍රවේශ නොවන අතර එය විධානය සඳහා ද වැරදිය IF. FOR(කණ්ඩායම් ලිපිගොනු වල) විධානයට පමණක් ද්විත්ව ප්‍රතිශතයක් අවශ්‍ය වේ, නමුත් එසේ වුවද %%1FOR පරාමිතියක් නිර්වචනය කර තර්ක වලට ප්‍රවේශ නොවනු ඇත
jeb

51

එය සංකීර්ණ කිරීමට අවශ්ය නැත. එය හුදෙක්% 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පරාමිතිය අත්හරින්න .


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 /?
jeb

19

මම සරල කියවීමේ_පාරාම් ස්ක්‍රිප්ට් එකක් ලිවූ අතර එය ශ්‍රිතයක් ලෙස හැඳින්විය හැකිය (නැතහොත් බාහිර .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නමුත් වටිනාකමක් නැති පරාමිතීන් ලැයිස්තුවක් නොදැන හිස් අගයන්ට ඉඩ දිය හැකි ක්‍රමයක් ගැන මට සිතිය නොහැක.

චේන්ලොග්

  • 2/18/2016
    • තවදුරටත් පුළුල් කිරීම අවශ්‍ය නොවේ
    • -පෙර පරාමිතීන් සෙවීමෙන් දැන් වෙනත් විධාන රේඛා තර්ක සමඟ ක්‍රියා කරයි .

මේ ආකාරයෙන් කණ්ඩායම් ගොනුවකට තර්ක යැවීමට මා කැමති බැවින් මෙම ක්‍රමය භාවිතා කිරීම පිළිබඳව සොයා බැලීය. කෙසේ වෙතත්, විචල්‍යයන් සැකසීමෙන් පසුව, කණ්ඩායම් ගොනුවෙන් පිටවීමෙන් පසුව පවා පරාමිතීන් cmd තුළ ප්‍රවේශ වී ඇත්නම් සහ කණ්ඩායම අවසන් වී ඇත්නම් ඒවා පෙර තත්වයට යථා තත්ත්වයට පත් නොවන බව මම දනිමි. මෙම ක්‍රමය එම තත්වයට මුහුණ දිය යුතුද?
ජොනෝ_2007

මාතෘකාව මත සහ මෙම ත්‍රෙඩ් එකේ ඉතිරි පිළිතුරු වලට වඩා හොඳයි.
jwdonahue

ධජ ආග්ස් (අගයන් නොමැතිව) සඳහා එය දිගු කරන ලදි. ආකෘතිකරණය නොමැති වීම ගැන කණගාටුයි, නමුත් එය අදහස් දැක්වීමේදී ක්‍රියා නොකරයි: කියවන්න_පාරම්% 1 / == / නොවේ නම් ("% __ var%" == "" (එසේ නොවේ නම් "% __ var: ~ 0,1%" == "-" (endlocal goto read_params) endlocal & set% __ var: ~ 1% =% ~ 1) වෙනත් (setlocal & set __var =% ~ 1) shift goto read_params) වෙනත් (එසේ නොවේ නම් "% __ var%" == "" (endlocal & set% __ var: ~ 1% = 1))
මැක්ස්

17

කණ්ඩායම් ගොනුවේ

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 ප්‍රෝ සඳහා ක්‍රියා කරයි.


7

ආවේශය වෙනත් තැන්වල පිළිතුර @Jon විසින්, මම නම් පරාමිති, විකල්ප අගයන් හා ස්විච මිරිකා ගැනීම සඳහා වඩා පොදු ඇල්ගොරිතමය නිමැවුණු ඇත.

අපට උපයෝගීතාවයක් ක්‍රියාත්මක කිරීමට අවශ්‍ය යැයි කියමු 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 වෙත යවන බව සලකන්න .
  • වින්ඩෝස් කණ්ඩායම් ගොනුවක හිස් පේළියක් අවශ්‍යද? ඔබ භාවිතා කළ යුතුයි ECHO:හෝ වෙනස්කම් වලින් එකක්.

4

නව කණ්ඩායම් ගොනුවක් සාදන්න (උදාහරණ: openclass.bat) ගොනුවේ මෙම පේළිය ලියන්න:

java %~n1

ඉන්පසු කණ්ඩායම් ගොනුව තබන්න, system32 ෆෝල්ඩරය, ඔබේ ජාවා පන්තියේ ගොනුව වෙත යන්න, දකුණු ක්ලික් කරන්න, ගුණාංග, විවෘත කරන්න ..., ඉන්පසු ඔබේ කණ්ඩායම් ගොනුව සොයාගෙන එය තෝරන්න, එය එයයි ...

එය මට වැඩ කරයි.

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 යනු වත්මන් නාමාවලි මාර්ගයයි.

දේවල් සරල ලෙස තබා ගැනීම සඳහා විධාන පරාමිතිය විචල්‍ය ලෙස ගබඩා කර සංසන්දනය සඳහා විචල්‍යය භාවිතා කරන්න.

එය ලිවීමට සරල පමණක් නොව නඩත්තු කිරීමද සරල ය. පසුව වෙනත් අයෙකු හෝ ඔබ දීර් script කාලයකට පසු ඔබේ පිටපත කියවන්නේ නම් එය තේරුම් ගැනීමට හා නඩත්තු කිරීමට පහසු වනු ඇත.

කේත පේළියේ ලිවීමට: වෙනත් පිළිතුරු බලන්න.


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.