Kaip perduoti komandinės eilutės parametrus partijos rinkmenai?

Turiu perduoti ID ir slaptažodį partijos rinkmenai vykdymo metu, o ne koduoti juos į failą.

Tai atrodo komandų eilutėje:

 test.cmd admin P@55w0rd > test-log.txt 
993
25 авг. nustatė Keng 25 rug. 2008-08-25 21:14 '08 9:14 val. 2008-08-25 21:14
@ 15 atsakymų

Taip aš tai darau.

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

Tai atrodo komandų eilutėje:

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

% 1 taikomas pirmajam parametrams,% 2 (ir čia yra kietoji dalis) reiškia antrąjį. Taigi galite perduoti iki 9 parametrų.

248
18 сент. Keng atsakymas, pateiktas rugsėjo 18 d 2008-09-18 15:26 '08 15:26 2008-09-18 15:26

Kitas naudingas patarimas yra „ %* “ naudoti „viską“. Pavyzdžiui:

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

Paleidus:

 test-command admin password foo bar 

Pirmiau nurodytas paketo failas veiks:

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

Gali būti šiek tiek neteisinga sintaksė, tačiau tai yra bendra idėja.

881
25 авг. Greg Hewgill atsakymas, rugpjūčio 25 d 2008-08-25 22:41 '08 at 10:41 pm 2008-08-25 22:41

Jei norite protingai tvarkyti trūkstamus parametrus, galite tai padaryti:

 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 
127
25 авг. atsakymas suteiktas 25 d. 2008-08-25 23:03 '08 at 11:03 pm 2008-08-25 23:03

Prieiga prie paketų parametrų gali būti paprasta naudojant% 1,% 2, ...% 9 arba% *,
bet tik tuo atveju, jei turinys yra paprastas.

Sudėtingam turiniui, pvz., "> , Nėra paprasto būdo, nes neįmanoma pasiekti% 1, nesukuriant klaidos.

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

Linijos plečiasi į

 set var=" set "var=" set var=" set "var="> 

Ir kiekviena eilutė nepavyksta, nes viena iš > yra už kabučių.

Tai galima išspręsti skaitant iš pažymėto parametro versijos laikino failo.

 @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!' 

Trick yra įgalinti echo on ir išplėsti% 1 po rem operatoriaus (taip pat veikia %2.. %* ).
Taigi, net ir "> gali būti rodomi be klaidų, kaip pažymėta.

Tačiau, kad galėtumėte peradresuoti echo on išėjimą, jums reikia dviejų kilpų.

Papildomi * # simboliai naudojami turiniui apsaugoti, kaip /? (parodyti REM ).
Arba eilutės pabaigoje esantis „^“ simbolis gali veikti kaip kelių eilučių simbolis, net ir po to, kai rem .

Tada mes perskaitome failą rem parametrą , tačiau atidžiai.
FOR / F turi dirbti su atidėtu pratęsimu, kitaip turinys su „!“ bus sunaikinta.
Pašalinus papildomus simbolius param1 jūs jį gavote.

Ir saugiam param1 naudojimui, param1 pratęsti atidėjimą.

81
31 марта '11 в 1:16 2011-03-31 01:16 atsakymas pateikiamas arba kovo 31 d. 11, 16:16 2011-03-31 01:16

O, ir tiesiog nepamirškite naudoti %%1 tipo kintamuosius, kai naudojate, ir for ir gaujas.

Jei pamiršote dvigubą % , pakeisite (galbūt nuliu) komandų eilutės argumentus ir gausite gana klaidinančius klaidų pranešimus.

53
25 авг. atsakymą pateikė Frank Krueger 25 rug. 2008-08-25 21:16 '08 at 9:16 pm 2008-08-25 21:16

Nereikia jį apsunkinti. Tai yra tik komandos 1% 2 parametrai, pvz.,

 @echo off xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z echo copied %1 to %2 pause 

„Pauzė“ parodo, ką komandų failas padarė, ir laukia, kol paspausite ANY klavišą. Išsaugokite jį kaip xx.bat į „Windows“ aplanką.

Jei norite naudoti, įveskite, pavyzdžiui:

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

Šis paketinis failas atlieka visus būtinus parametrus, pvz., Kopijuoja tik naujus failus ir pan. Aš jį naudoju prieš „Windows“. Jei norite pamatyti failų pavadinimus, kai jie yra kopijuojami, palikite Q parametrą.

48
19 апр. Atsakymas pateikiamas DearWebby 19 d. 2012-04-19 02:46 '12 at 2:46 2012-04-19 02:46
 @ECHO OFF :Loop IF "%1"=="" GOTO Continue SHIFT GOTO Loop :Continue 

Pastaba: jei "%1"=="" sukels problemų, jei %1 įtraukta į kabutes.

Tokiu atveju naudokite IF [%1]==[] arba, tik NT 4 (SP6) ir vėlesniuose, IF "%~1"=="" .

30
14 марта '14 в 9:02 2014-03-14 09:02 atsakymas pateikiamas dešiniuoju laiku, kovo 14 d., 14 val. 9:02 2014-03-14 09:02

Neseniai draugas man paklausė apie šią temą, todėl nusprendžiau skelbti, kaip tvarkyti komandų eilutės argumentus paketiniuose failuose.

Šis metodas turi šiek tiek pridėtinės vertės, kaip matysite, bet mano rinkmenų failus labai lengva suprasti ir greitai įdiegti. Be šių struktūrų palaikymo:

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

Jo esmė turi funkcijas :init :parse ir :main .

Naudojimo pavyzdys

 >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 
25
13 июля '17 в 6:32 2017-07-13 06:32 atsakymą davė wasatchwizard liepos 13 d. 17, 6:32 2017-07-13 06:32

Tegul tai bus lengva.

Čia yra failas .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% 

Čia yra trys komandų eilutės įkėlimai.

 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> 
19
31 дек. Meilės ir taikos atsakymas - Joe Codeswell gruodžio 31 d 2015-12-31 20:59 '16, 20:59 2015-12-31 20:59
 FOR %%A IN (%*) DO ( REM Now your batch file handles %%A instead of %1 REM No need to use SHIFT anymore. ECHO %%A ) 

Tai rodo partijos parametrus (% *), arba jie yra cituojami, ar ne, ir tada kiekvieno parametro aidas.

17
25 нояб. atsakymas pateiktas Amr Ali 25 lapkričio. 2014-11-25 07:39 '14, 7:39 2014-11-25 07:39

Parašiau paprastą read_params scenarijų, kurį galima pavadinti funkcija (arba išorine .bat ) ir įdėti visus kintamuosius į dabartinę aplinką. Jis nepakeis originalių parametrų, nes call funkcija veikia su originalių parametrų kopija.

Pavyzdžiui, naudodami šią komandą:

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

myscript.bat galės naudoti kintamuosius po to, kai paskambins į šią funkciją:

 call :read_params %* echo %random% echo %greeting% 

Čia yra funkcija:

 :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 

Apribojimai

  • Nepavyko įkelti argumentų, neturinčių reikšmės, pvz., -force . Galite naudoti -force=true , bet aš negaliu galvoti apie tai, kaip leisti nulines reikšmes, nežinodamas parametrų sąrašo prieš laiką, nesvarbu.

Keisti

  • 2016 2 18
    • Vėlinis pratęsimas nereikalingas.
    • Dabar jis veikia su kitais komandų eilutės argumentais, ieško prieš parametrus.
16
17 февр. Atsakymą pateikė Evan Kennedy vasario 17 d. 2016-02-17 03:24 '16 at 3:24 2016-02-17 03:24

Norėdami nurodyti nurodytą kintamąjį komandų eilutėje, turėsite naudoti „% a%“, pavyzdžiui, pvz .:

  set a=100 echo %a% output = 100 

Pastaba Tai veikia „Windows 7“ programoje.

8
14 нояб. atsakymas pateikiamas CMS_95 14 nov. 2013-11-14 21:16 '13, 9:16 pm 2013-11-14 21:16

Sukurkite naują paketo failą (pvz .: openclass.bat) ir įrašykite šią eilutę faile:

 java %~n1 

Tada įdėkite paketinį failą, pvz., Į aplanką system32, eikite į „Java“ klasės failą, dešiniuoju pelės klavišu spustelėkite „Properties“, „Open With ...“, tada suraskite paketinį failą, pasirinkite jį ir ... / p>

Jis veikia man.

PS: aš negaliu rasti būdo uždaryti cmd >

4
06 февр. Atsakymą pateikė SvenVP 06 vasaris. 2011-02-06 16:33 '11 at 16:33 2011-02-06 16:33

Įkvėptas atsakymo kitur @Jon, aš sukūriau bendresnį algoritmą, skirtą išgauti vardinius parametrus, papildomas vertes ir jungiklius.

Tarkime, mes norime įgyvendinti „ foobar įrankį. Reikalinga pradinė komanda. Jis turi pasirinktinį parametrą - --foo kuris užima neprivalomą vertę (kuri, žinoma, negali būti kitas parametras); jei nėra reikšmės, pagal default default . Jame taip pat yra pasirinktinis parametras - --bar kuri užima norimą vertę. Galiausiai, jis gali užimti „ --baz vėliavą be tinkamos vertės. Oi, ir šios galimybės gali būti bet kokia tvarka.

Kitaip tariant, tai atrodo taip:

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

Čia pateikiamas sprendimas:

 @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> ECHO: GOTO usage ) ) ELSE IF "%PARAM%" == "--baz" ( SHIFT SET BAZ=true ) ELSE IF "%PARAM%" == "" ( GOTO endargs ) ELSE ( ECHO Unrecognized option %1. 1> 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 
  • Naudokite SETLOCAL , kad kintamieji skambinančioje aplinkoje nebūtų SETLOCAL .
  • Nepamirškite inicijuoti kintamųjų SET FOO= ir tt Jei kas nors juos apibrėžė skambinančioje aplinkoje.
  • Jei norite pašalinti kabutes, naudokite %~1 .
  • Naudokite IF "%ARG%" == "" ir ne IF [%ARG%] == [] nes [ ir ] visai neveikia, reikšmės baigiasi tarpu.
  • Net jei SHIFT viduje IF blokas, dabartiniai argumentai, pvz., %~1 , nėra atnaujinami, nes jie nustatomi analizuojant IF . Galite naudoti %~1 ir %~2 viduje IF bloką, tačiau tai gali būti paini, nes turite SHIFT . Aiškumo sumetimais SHIFT galite įdėti bloko pabaigoje, tačiau tai gali prarasti ir / arba supainioti žmones. Taigi „užfiksavimas“ %~1 ir %~1 už bloko atrodo geriausias.
  • Jūs nenorite naudoti parametro, o ne kito parametro pasirinktinės vertės, todėl reikia patikrinti, ar IF NOT "%ARG:~0,2%" == "--" .
  • Būkite atsargūs tik SHIFT kai naudojate vieną iš parametrų.
  • Dvigubas kodas SET FOO=%DEFAULT_FOO% yra apgailėtinas, tačiau alternatyva yra pridėti IF "%FOO%" == "" SET FOO=%DEFAULT_FOO%IF NOT "%ARG%" == "" blokuoti IF NOT "%ARG%" == "" , Tačiau, kadangi jis vis dar yra IF "%PARAM%" == "--foo" , %FOO% reikšmė bus įvertinta ir nustatyta prieš jus, - niekada nerasite, kad abi yra --foo buvo parametras, ir nebuvo reikšmės %FOO% .
  • Atkreipkite dėmesį, kad ECHO Missing bar value. 1>> ECHO Missing bar value. 1>> ECHO Missing bar value. 1>> ECHO Missing bar value. 1>> siunčia klaidos pranešimą stderr.
  • Norite, kad „Windows“ komandų faile būtų tuščia eilutė? Turite naudoti ECHO: arba vieną iš parinkčių.
3
02 июня '18 в 5:41 2018-06-02 05:41 Garret Wilson atsakymas Birželio 02-18 d. 5:41 2018-06-02 05:41

Paprastas sprendimas (nors klausimas yra senas)

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 

išėjimas

 YourLocalPath>call "C:\Temp\test.bat" pass123 YourLocalPath>echo off "Batch started" "arg1 is pass123" YourLocalPath>pause Press any key to continue . . . 

Kur „YourLocalPath“ yra dabartinis katalogo kelias.

Siekiant paprastumo, išsaugokite param komandą kintamajame ir naudokite kintamąjį palyginimui.

Tai nėra lengva rašyti, bet taip pat jį lengva prižiūrėti, taigi, jei vėliau kitas asmuo arba skaitysite savo scenarijų per ilgą laiką, tai bus lengva suprasti ir išlaikyti.

Norėdami parašyti kodą eilutėje: žr. Kiti atsakymai.

2
03 июля '18 в 16:48 2018-07-03 16:48 atsakymą pateikė Amol Ramkrishna Patil liepos 18 d. 18 val. 16:48 2018-07-03 16:48