[Windows] Wie übergebe ich Befehlszeilenparameter an eine Batch-Datei?


Answers

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.

Question

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



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 jist davon hat die Funktionen :init ,: parse und :main .

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



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 schlägt fehl, da eines der & außerhalb der Anführungszeichen steht.

Es kann gelöst werden, indem aus einer temporären Datei eine merkwürdige Version des Parameters gelesen wird.

@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, echo on zu aktivieren und das% 1 nach einer rem Anweisung zu erweitern (funktioniert auch mit% 2 ..% *).
So konnte sogar "&"& echo wiederholt werden, ohne einen Fehler zu erzeugen, wie es angemerkt wird.

Um jedoch die Ausgabe des echo on weiterleiten zu können, benötigen Sie die beiden FOR-LOOPS.

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

Dann lesen Sie den Rem-Parameter- Ausgang aus der Datei, aber vorsichtig.
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.




Um auf eine set-Variable in der Befehlszeile zu verweisen, müssten Sie "% a%" verwenden, also zum Beispiel:

      set a=100 
      echo %a%  
      output = 100 

Hinweis: Dies funktioniert für Windows 7 Pro.




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 den Q Parameter weg.




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.