it-swarm.com.de

Verwenden von Parametern in Batchdateien in der Windows-Befehlszeile

Wie greifen Sie unter Windows auf Argumente zu, die beim Ausführen einer Batchdatei übergeben werden?

Angenommen, ich habe ein Programm mit dem Namen hello.bat. Wie kann ich meinem Programm mitteilen, dass hello -a als Argument übergeben wurde, wenn ich -a an einer Windows-Befehlszeile eingebe?

152
APerson

Wie bereits erwähnt, können Parameter, die über die Befehlszeile übergeben werden, in Batch-Dateien mit der Notation %1 bis %9 aufgerufen werden. Es gibt auch zwei andere Token, die Sie verwenden können:

  • %0 ist der Name der ausführbaren Datei (Batch-Datei), wie in der Befehlszeile angegeben.
  • %* ist alle in der Befehlszeile angegebenen Parameter - Dies ist sehr nützlich, wenn Sie die Parameter an ein anderes Programm weiterleiten möchten.

Neben dem einfachen Zugriff auf die Parameter sind viele wichtige Techniken zu beachten.

Überprüfung, ob ein Parameter übergeben wurde

Dies geschieht mit Konstrukten wie IF "%~1"=="", was nur dann zutrifft, wenn überhaupt keine Argumente übergeben wurden. Beachten Sie das Tilde-Zeichen, durch das umgebende Anführungszeichen aus dem Wert von %1 entfernt werden. Ohne Tilde erhalten Sie unerwartete Ergebnisse, wenn dieser Wert doppelte Anführungszeichen enthält, einschließlich der Möglichkeit von Syntaxfehlern.

Mit mehr als 9 Argumenten umgehen (oder einfach das Leben einfacher machen)

Wenn Sie auf mehr als 9 Argumente zugreifen müssen, müssen Sie den Befehl SHIFT verwenden. Dieser Befehl verschiebt die Werte aller Argumente um eine Stelle, sodass %0 den Wert von %1, %1 den Wert von %2 usw. %9 annimmt. Nimmt den Wert des zehnten Arguments (falls eines vorhanden ist), das über keine Variable verfügbar war, bevor SHIFT aufgerufen wurde (geben Sie den Befehl SHIFT /? ein, um weitere Optionen zu erhalten).

SHIFT ist auch nützlich, wenn Sie Parameter einfach verarbeiten möchten, ohne dass diese in einer bestimmten Reihenfolge angezeigt werden müssen. Beispielsweise kann ein Skript die Flags -a und -b in beliebiger Reihenfolge erkennen. Eine gute Möglichkeit, die Befehlszeile in solchen Fällen zu analysieren, ist

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

Mit diesem Schema können Sie ziemlich komplexe Befehlszeilen analysieren, ohne verrückt zu werden.

Substitution von Chargenparametern

Für Parameter, die Dateinamen darstellen, bietet die Shell zahlreiche Funktionen für die Arbeit mit Dateien, auf die auf keine andere Weise zugegriffen werden kann. Auf diese Funktionalität wird mit Konstrukten zugegriffen, die mit %~ beginnen.

Um beispielsweise die Größe der als Argument übergebenen Datei zu ermitteln, verwenden Sie

ECHO %~z1

Um den Pfad des Verzeichnisses zu ermitteln, aus dem die Batch-Datei gestartet wurde (sehr nützlich!), Können Sie verwenden

ECHO %~dp0

Sie können den gesamten Umfang dieser Funktionen anzeigen, indem Sie in der Eingabeaufforderung CALL /? eingeben.

276
Jon

Verwenden von Parametern in Batchdateien:% 0 und% 9

Stapeldateien können auf die Wörter verweisen, die als Parameter mit den Tokens übergeben wurden: %0 bis %9.

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

in der Befehlszeile übergebene Parameter müssen aus alphanumerischen Zeichen bestehen und durch Leerzeichen getrennt sein. Da %0 der Programmname ist, wie er aufgerufen wurde, ist in DOS %0 für AUTOEXEC.BAT leer, wenn es beim Booten gestartet wird.

Beispiel:

Fügen Sie den folgenden Befehl in eine Batchdatei mit dem Namen mybatch.bat ein:

@echo off
@echo hello %1 %2
pause

Wenn Sie die Batch-Datei folgendermaßen aufrufen: mybatch john billy würde Folgendes ausgeben:

hello john billy

Holen Sie sich mehr als 9 Parameter für eine Batch-Datei, verwenden Sie:% *

Der Prozentstern-Token %* bedeutet "der Rest der Parameter". Sie können eine for-Schleife verwenden, um sie zu erfassen, wie hier definiert:

http://www.robvanderwoude.com/parameters.php

Hinweise zu Begrenzern für Stapelparameter

Einige Zeichen in den Befehlszeilenparametern werden von Batch-Dateien ignoriert, abhängig von der DOS-Version, ob sie "maskiert" werden oder nicht, und häufig abhängig von ihrer Position in der Befehlszeile:

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored
53
Eric Leschinski

Stapeldateien übergeben den Text automatisch nach dem Programm, sofern es sich um Variablen handelt, denen sie zugewiesen werden können. Sie werden in der Reihenfolge übergeben, in der sie gesendet werden. z.B. % 1 ist der erste String, der gesendet wird, nachdem das Programm aufgerufen wurde usw.

Wenn Sie Hello.bat haben und die Inhalte sind:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

und Sie rufen den Befehl batch in über auf

hallo.bat APerson241% date%

sie sollten diese Nachricht zurückerhalten:

Hallo, APerson241, vielen Dank, dass Sie diese Batch-Datei ausgeführt haben (11.01.2013).

5
rud3y

Verwenden Sie Variablen, d. H. Die Variablen .BAT und rufen Sie %0 bis %9 auf

3
tohava

@ Jons :parse/:endparse Schema ist ein großartiger Anfang, und er ist dankbar für den ersten Durchgang, aber wenn Sie denken, dass das Windows Torturous Batch-System Sie so einfach davonkommen lassen würde ... na, mein Freund Sie stehen vor einem Schock. Ich habe den ganzen Tag mit dieser Teufelei verbracht und nach vielen mühsamen Nachforschungen und Experimenten habe ich endlich etwas geschafft, das für ein reales Unternehmen brauchbar ist.

Nehmen wir an, wir möchten ein Hilfsprogramm foobar implementieren. Es erfordert einen ersten Befehl. Es hat einen optionalen Parameter --foo, der einen optionalen Wert annimmt (der natürlich kein anderer Parameter sein kann); Wenn der Wert fehlt, wird standardmäßig default verwendet. Es hat auch einen optionalen Parameter --bar, der einen erforderlichen Wert annimmt. Zuletzt kann ein Flag --baz verwendet werden, ohne dass ein Wert zulässig ist. Oh, und diese Parameter können in beliebiger Reihenfolge angegeben werden.

Mit anderen Worten sieht es so aus:

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

Kompliziert? Nein, das scheint ziemlich typisch für echte Versorgungsunternehmen zu sein. (git jemand?)

Hier ist ohne weiteres eine Lösung:

@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

Ja, es ist wirklich so schlimm. Siehe meinen ähnlichen Beitrag unter https://stackoverflow.com/a/50653047/421049 , wo ich mehr Analyse darüber gebe, was in der Logik vor sich geht und warum ich bestimmte Konstrukte verwendet habe.

Abscheulich. Das meiste musste ich heute lernen. Und es tat weh.

2
Garret Wilson