Frage Wie übergebe ich Befehlszeilenparameter an eine Batch-Datei?


Ich muss ID und Passwort zum Zeitpunkt der Ausführung an eine cmd (oder bat) -Datei übergeben, anstatt sie in die Datei zu codieren.

So sieht die Befehlszeile aus:

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

904
2017-08-25 18:14


Ursprung


Antworten:


Ein weiterer nützlicher Tipp ist zu verwenden %* "alles" bedeuten. Beispielsweise:

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

Wenn du rennst:

test-command admin password foo bar

Die obige Batchdatei wird ausgeführt:

fake-command /u admin /p password foo bar

Ich kann die Syntax etwas falsch haben, aber das ist die allgemeine Idee.


805
2017-08-25 19:41



Hier ist, wie ich es mache.

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

So sieht die Befehlszeile aus:

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

% 1 gilt für den ersten Parameter,% 2 (und hier ist der schwierige Teil) für den zweiten Parameter. Auf diese Weise können Sie bis zu 9 Parameter übergeben.


225
2017-09-18 12:26



Wenn Sie fehlende Parameter intelligent behandeln möchten, können Sie Folgendes tun:

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

117
2017-08-25 20:03



Der Zugriff auf Stapelparameter kann einfach mit% 1,% 2, ...% 9 oder auch% * erfolgen.
aber nur wenn der Inhalt einfach ist.

Es gibt keinen einfachen Weg für komplexe Inhalte wie "&"^&, da es nicht möglich ist, auf% 1 zuzugreifen, ohne einen Fehler zu erzeugen.

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

Die Linien erweitern sich zu

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

Und jede Zeile versagt, als einer der & ist außerhalb der Anführungszeichen.

Es kann mit dem Lesen von einer temporären Datei a gelöst werden bemerkt Version des Parameters.

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

Der Trick besteht darin, zu aktivieren echo on und erweitern Sie% 1 nach a rem Anweisung (funktioniert auch mit% 2 ..% *).
So eben "&"& könnte wiederholt werden, ohne einen Fehler zu erzeugen, wie es bemerkt wird.

Aber um die Ausgabe der echo onDu brauchst die zwei FOR-LOOPS.

Die zusätzlichen Zeichen * # werden verwendet, um gegen Inhalte wie / sicher zu sein? (würde die Hilfe für REM zeigen).
Oder ein Caret ^ am Zeilenende könnte als mehrzeiliges Zeichen auch nach a funktionieren rem.

Dann lesen Sie die Rem-Parameter Ausgabe von der Datei, aber sorgfältig.
Das FOR / F sollte mit verzögerter Expansion arbeiten, ansonsten mit "!" würde zerstört werden.
Nachdem Sie die zusätzlichen Zeichen in Param1 entfernt haben, haben Sie es verstanden.

Und um param1 auf sichere Weise zu verwenden, aktivieren Sie die verzögerte Erweiterung.


71
2018-03-30 22:16



Ja, und vergessen Sie nicht, Variablen wie %%1 beim Benutzen if und for und die Bande.

Wenn du das Doppelte vergisst %, dann werden Sie in (möglicherweise Null) Befehlszeilenargumente ersetzen und Sie werden einige ziemlich verwirrende Fehlermeldungen erhalten.


51
2017-08-25 18:16



Es besteht keine Notwendigkeit, es zu komplizieren. Es ist einfach Befehl% 1% 2 Parameter, zum Beispiel

@echo off

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

echo copied %1 to %2

pause

Die "Pause" zeigt an, was die Batch-Datei getan hat und wartet darauf, dass Sie die ANY-Taste drücken. Speichern Sie das als xx.bat im Windows-Ordner.

Geben Sie zum Beispiel Folgendes ein:

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

Diese Batch-Datei kümmert sich um alle notwendigen Parameter, wie zum Beispiel das Kopieren von Dateien, die neuer sind, usw. Ich habe es seit Windows verwendet. Wenn Sie die Namen der Dateien sehen möchten, während sie kopiert werden, lassen Sie die Q Parameter.


45
2018-04-18 23:46



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

Hinweis: IF "%1"=="" wird Probleme verursachen, wenn %1 ist in Anführungszeichen eingeschlossen.

In diesem Fall verwenden Sie IF [%1]==[]oder, in NT 4 (SP6) und später nur, IF "%~1"=="" stattdessen.


30
2018-03-14 06:02



Ein Freund hat mich kürzlich nach diesem Thema gefragt, also habe ich mir überlegt, wie ich Befehlszeilenargumente in Batch-Dateien behandeln soll.

Diese Technik hat ein wenig Overhead, wie Sie sehen werden, aber es macht meine Batch-Dateien sehr einfach zu verstehen und schnell zu implementieren. Sowie unterstützen die folgenden Strukturen:

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

Der Vorteil davon ist die :init, :parse, und :main Funktionen.

Beispielverwendung

>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"

Vorlage.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

23
2017-07-13 03:32



Lass uns das einfach halten.

Hier ist die .cmd Datei.

@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%

Hier sind 3 Aufrufe von der Kommandozeile.

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>

18
2017-12-31 17:59



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

Dadurch werden die Stapelparameter (% *) entweder in Anführungszeichen gesetzt oder nicht, und dann werden die einzelnen Parameter mit einem Echo versehen.


16
2017-11-25 04:39



Ich habe ein einfaches read_params-Skript geschrieben, das als Funktion (oder extern) aufgerufen werden kann .bat) und setzt alle Variablen in die aktuelle Umgebung. Es wird nicht die ursprünglichen Parameter ändern, weil die Funktion ist called mit einer Kopie der ursprünglichen Parameter.

Zum Beispiel mit dem folgenden Befehl:

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

myscript.bat wäre in der Lage, die Variablen nach dem Aufruf der Funktion zu verwenden:

call :read_params %*

echo %random%
echo %greeting%

Hier ist die Funktion:

: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

Einschränkungen

  • Argumente können nicht geladen werden, z. B. -force. Du könntest benutzen -force=true aber ich kann mir keine Möglichkeit vorstellen, leere Werte zuzulassen, ohne vorher eine Liste von Parametern zu kennen, die keinen Wert haben.

Änderungsprotokoll

  • 18/18/2016
    • Es ist keine verzögerte Erweiterung mehr erforderlich
    • Arbeitet jetzt mit anderen Befehlszeilenargumenten, indem Sie suchen - vor Parametern.

16
2018-02-17 00:24