Wie kann ich Argumente an eine Batchdatei übergeben?

1167

Ich muss zum Zeitpunkt der Ausführung eine ID und ein Kennwort an eine Batchdatei übergeben, anstatt sie fest in die Datei zu codieren.

So sieht die Befehlszeile aus:

test.cmd admin P@55w0rd > test-log.txt
Keng
quelle
8
Für "den ganzen Rest" siehe Greg Hegills Kommentar, wie man Batch-
Matt Wilkie
Ich habe ein Umgebungsstart-Skript, das meinen Benutzernamen / mein Kennwort in Umgebungsvariablen überträgt, damit ich sie nicht jedes Mal eingeben muss. Ich verwende jedoch die meiste Zeit Bash (Linux, Mac und Windows) und müssen für Proxy-Konfigurationen in Skripten usw. für die Arbeit verwendet werden.
Tracker1

Antworten:

1032

Ein weiterer nützlicher Tipp ist %*"alle". Zum Beispiel:

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

Wenn Sie laufen:

test-command admin password foo bar

Die obige Batch-Datei wird ausgeführt:

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

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

Greg Hewgill
quelle
123
% * wird unabhängig von der Verschiebung auf alle Parameter erweitert. Selbst nach den beiden Schichten hätten Sie also immer noch die ersten beiden Argumente in% *. Sie können Folgendes verwenden : stackoverflow.com/questions/761615/… , um eine Variable abzurufen , die alles außer den ersten n Parametern enthält.
Joey
1
Bitte beachten Sie, dass% * nicht überall funktioniert! Zum Beispiel funktioniert es nicht mit DOSBox 0.73 (möglicherweise ist dies ein Fehler, der gemeldet werden sollte).
Denilson Sá Maia
28
Es ist kein Fehler, da% * unter MS-DOS oder Win9x überhaupt nicht funktioniert hat.
Kef Schecter
Ich denke, shift"knallt" das Argument aus der Liste. Die Annahme von OP war, dass %*nur die verbleibenden Argumente ausgegeben würden, aber es funktioniert nicht so, wie @Joey sagte.
NathanAldenSr
5
Diese Antwort ist falsch. Es ergibt sich tatsächlich fake-command /u admin /p password admin password foo bar. Darauf hat @Joey vor vielen Jahren hingewiesen.
Jwdonahue
286

So habe ich es gemacht:

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

So sieht der Befehl aus:

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

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

Keng
quelle
16
Wenn Sie so dumm sind wie ich, hat Ihr Verstand nach dem echo %1 %2einfachsten Fall mit a @und a fake-commandmit Params gesucht und ihn weggeworfen, weil Sie dachten, wir würden fake-command.batspäter den Inhalt bekommen (in diesem Fall der überkompliziert müssen fake-command.batmöglicherweise echo %2 %4die Parameternamen ignoriert werden). Falsch, doofus. TL; DR: Sei nicht so dumm wie ich. 1. echo echo %1 %2 > test.bat2 test word1 word2.. 3. Gewinn.
Ruffin
143

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
thelsdj
quelle
2
Welche Bedeutung hat Punkt / Periode bei diesen Gleichheitsoperationen?
Chris
4
Wenn% 1 leer ist, ist dies im Grunde genommen IF. ==. und so wird das GOTO passieren. Wir verwenden x hier also: WENN x% 1 == x -> WENN x == x -> wahr
Carl
1
Sie sollten sich fragen, welchen Wert ein "nicht bereitgestelltes Argument" hat. Gegen was sollten Sie ein "nicht bereitgestelltes Argument" überprüfen? Wenn Sie dann keine Antwort haben, sollten Sie einen Trick wie den der Punkte verwenden. Denken Sie daran, wie hier angegeben, ss64.com/nt/if.html "Sie können tatsächlich fast jedes Zeichen für dieses '~' oder geschweifte Klammern {} oder sogar die Zahl 4 verwenden, aber eckige Klammern werden in der Regel gewählt, weil Sie haben keine besondere Bedeutung. "
Adriano GV Esposito
89

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

Es gibt keine einfache Möglichkeit 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 sich eine der Zeilen &außerhalb der Anführungszeichen befindet.

Es kann durch Lesen einer kommentierten Version des Parameters aus einer temporären Datei gelöst werden.

@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,% 1 nach einer remAnweisung zu aktivieren und zu erweitern (funktioniert auch mit %2 .. %*).
So "&"&könnte sogar ohne Fehler wiedergegeben werden, wie es bemerkt wird.

Um jedoch die Ausgabe von umleiten zu können echo on, benötigen Sie die beiden for-Schleifen.

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

Lesen Sie dann den aus der Datei ausgegebenen rem-Parameter sorgfältig durch.
Das FOR / F sollte mit verzögerter Erweiterung funktionieren, sonst Inhalt mit "!" würde zerstört werden.
Nach dem Entfernen der zusätzlichen Zeichen inparam1 , haben Sie es bekommen.

param1Aktivieren Sie die verzögerte Erweiterung, um eine sichere Verwendung zu gewährleisten.

jeb
quelle
für / F "tokens = *" %% a in ('echo% *') setze "all_args = %% a"
Kevin Edwards
@ KevinEdwards Dann versuchen Sie es mit einem &, Ihre Lösung funktioniert nur mit einfachen Inhalten
jeb
@ KevinEdwards Ich habe es getestet test.bat ^&und es schlägt fehl. Funktioniert nur test.bat "&", aber das war nicht mein Punkt. Sie können nicht verwenden %*, %1auf sichere Weise ohne die REM - Technik
jeb
Ah, ja, ein Caret entkommt ihm nicht richtig. Sie benötigen Angebote, was für alle Anwendungsfälle möglich ist, auf die ich gestoßen bin. Ich wollte es nur weitergeben. Danke, dass du es getestet hast! Prost :)
Kevin Edwards
2
@jwdonahue Ja, es ist kompliziert (aber nicht zu kompliziert). Aber besonders für Passwörter könnte es notwendig sein, zumindest einige meiner Passwörter enthalten kaufmännisches Und &und auch Anführungszeichen"
jeb
59

Ja, und vergessen Sie nicht, Variablen wie %%1bei ifund zu verwendenfor und die Bande zu verwenden.

Wenn Sie das Double vergessen %, ersetzen Sie (möglicherweise null) Befehlszeilenargumente und erhalten einige ziemlich verwirrende Fehlermeldungen.

Frank Krueger
quelle
%% ist nur für ifund for?
Royi Namir
25
Es ist schlimmer als das - %% wird verwendet, um Variablen und Befehlszeilenparametern in Batch-Dateien voranzustellen . Wenn Sie diese Befehle jedoch über die Befehlszeile verwenden, verwenden Sie nur% als Präfix. Beispiel: Inside Batch: for %%d in (*) do echo %%dVon der Kommandozeile:for %d in (*) do echo %d
Steve Midgley
11
@SteveMidgley Ich habe Ihren Kommentar wahrscheinlich vor einem Jahr oder so positiv bewertet. Ich vergaß es dann sofort und erst heute versuchte ich verwirrend auf meine for-Schleife in der Kommandozeile zu starren und fragte mich, warum sie furzte und nichts anderes tat. Hier ist eine weitere virtuelle Gegenstimme von mir. Ich werde in einem weiteren Jahr oder so zurück sein, wenn ich wieder das gleiche Problem habe.
icc97
Normalerweise reservieren wir die Ziffern für die Befehlszeilenverarbeitung und der doppelte Prozentsatz gilt meines Wissens nur für die for-Anweisung. @for %%2 in (testing) do @echo %%2 %1in einer Batch-Datei, erzeugt, testing 1wenn es mit 1 ( test 1) aufgerufen wird .
Jwdonahue
2
Die Antwort ist falsch. %%1greift nicht auf ein Befehlszeilenargument zu und ist auch für den IFBefehl falsch . Nur der FORBefehl (in Batch-Dateien) erfordert doppelte Prozentsätze, würde aber selbst dann %%1einen FOR-Parameter definieren und nicht auf Argumente zugreifen
jeb
51

Es besteht keine Notwendigkeit, dies 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 Taste ANY drücken. Speichern Sie das als xx.bat im Windows-Ordner.

Geben Sie dazu beispielsweise Folgendes ein:

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

Diese Batch-Datei kümmert sich um alle notwendigen Parameter, wie das Kopieren nur neuerer Dateien usw. Ich habe sie seit vor Windows verwendet. Wenn Sie die Namen der Dateien beim Kopieren sehen möchten, lassen Sie den QParameter weg .

DearWebby
quelle
41

Ein Freund hat mich kürzlich zu diesem Thema gefragt, daher dachte ich, ich würde posten, wie ich mit Befehlszeilenargumenten in Batch-Dateien umgehe.

Wie Sie sehen werden, ist diese Technik etwas aufwändig, aber meine Batch-Dateien sind sehr einfach zu verstehen und schnell zu implementieren. Sowie Unterstützung der folgenden Strukturen:

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

Der jist davon ist mit den :init, :parseund :mainFunktionen.

Anwendungsbeispiel

>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
wasatchwizard
quelle
32
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

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

Verwenden Sie in diesem Fall stattdessen IF [%1]==[]oder in NT 4 (SP6) und höher IF "%~1"=="".

Rightcodeatrighttime
quelle
Richtig, aber es berührt das Thema kaum.
Jwdonahue
22

Lassen Sie 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 Anrufe 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>
Liebe und Frieden - Joe Codeswell
quelle
20
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

Dies durchläuft die Stapelparameter (% *), entweder in Anführungszeichen oder nicht, und gibt dann jeden Parameter wieder.

Amr Ali
quelle
Aber nicht mit vielen verschiedenen Argumenten, wie test.bat *.txt, test.bat cat^&dogoderTest.bat /?
jeb
19

Ich habe ein einfaches read_params-Skript geschrieben, das als Funktion (oder extern .bat) aufgerufen werden kann und alle Variablen in die aktuelle Umgebung einfügt . Die ursprünglichen Parameter werden nicht geändert, da die Funktion ausgeführt wirdcall mit einer Kopie der ursprünglichen Parameter bearbeitet wird.

Beispiel: Geben Sie den folgenden Befehl ein:

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

myscript.bat könnte die Variablen nach dem Aufruf der Funktion 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 ohne Wert wie z -force. Sie könnten verwenden, -force=trueaber ich kann mir keine Möglichkeit vorstellen, leere Werte zuzulassen, ohne vorher eine Liste von Parametern zu kennen, die keinen Wert haben.

Änderungsprotokoll

  • 18.02.2016
    • Erfordert keine verzögerte Erweiterung mehr
    • Funktioniert jetzt mit anderen Befehlszeilenargumenten, indem nach -Vor-Parametern gesucht wird.
Evan Kennedy
quelle
Ich habe versucht, diese Methode zu verwenden, da ich auf diese Weise Argumente an eine Batch-Datei übergeben möchte. Ich stelle jedoch fest, dass nach dem Festlegen der Variablen die Parameter auch nach dem Beenden der Batchdatei im cmd festgelegt bleiben, wenn auf sie zugegriffen wird und der Batch beendet wurde. Sie werden nicht in ihren vorherigen Zustand zurückgesetzt. Sollte diese Methode mit dieser Situation umgehen?
Jono_2007
Zum Thema und besser als einige der restlichen Antworten in diesem Thread.
Jwdonahue
Es wurde erweitert, um Flag-Argumente (ohne Werte) zu unterstützen. Entschuldigung für fehlende Formatierung, aber es funktioniert nicht in Kommentaren: read_params wenn nicht% 1 / == / (wenn nicht "% __ var%" == "" (wenn nicht "% __ var: ~ 0,1%" == "-" (endlocal goto read_params) endlocal & set% __ var: ~ 1% =% ~ 1) else (setlocal & set __var =% ~ 1) shift goto read_params) else (wenn nicht "% __ var%" == "" (endlokal & setze% __ var: ~ 1% = 1))
Max
13

In Batch-Datei

set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%

% 1 und% 2 geben den ersten bzw. zweiten Argumentwert zurück.

Und in der Kommandozeile übergeben Sie das Argument

Directory> batchFileName admin P@55w0rd 

Ausgabe wird sein

admin
P@55w0rd
Der Pate
quelle
9

Um auf eine festgelegte Variable in der Befehlszeile zu verweisen, müssten Sie beispielsweise Folgendes verwenden %a%:

set a=100 
echo %a%  
rem output = 100 

Hinweis: Dies funktioniert unter Windows 7 Pro.

CMS_95
quelle
6

Inspiriert von einer Antwort von @Jon an anderer Stelle habe ich einen allgemeineren Algorithmus zum Extrahieren benannter Parameter, optionaler Werte und Schalter entwickelt.

Nehmen wir an, wir möchten ein Dienstprogramm implementieren foobar. Es erfordert einen ersten Befehl. Es hat einen optionalen Parameter, --fooder einen optionalen Wert annimmt (der natürlich kein anderer Parameter sein kann). Wenn der Wert fehlt, wird standardmäßig verwendet default. Es hat auch einen optionalen Parameter, --barder einen erforderlichen Wert annimmt. Schließlich kann es eine Flagge nehmen--baz ohne zulässigen Wert verwendet werden. Oh, und diese Parameter können in beliebiger Reihenfolge kommen.

Mit anderen Worten, es sieht so aus:

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

Hier ist 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
  • Verwenden Sie diese SETLOCALOption, damit die Variablen nicht in die aufrufende Umgebung gelangen.
  • Vergessen Sie nicht, die Variablen SET FOO=usw. zu initialisieren , falls jemand sie in der aufrufenden Umgebung definiert hat.
  • Verwenden Sie %~1diese Option , um Anführungszeichen zu entfernen.
  • Verwenden Sie IF "%ARG%" == ""und nicht IF [%ARG%] == []weil [und] spielen Sie überhaupt nicht mit Werten, die in einem Leerzeichen enden.
  • Selbst wenn Sie sich SHIFTin einem IFBlock befinden, werden die aktuellen Argumente wie z. B. %~1nicht aktualisiert, da sie bestimmt werden, wenn das IFanalysiert wird. Sie könnten %~1und %~2innerhalb des IFBlocks verwenden, aber es wäre verwirrend, weil Sie eine hatten SHIFT. Sie könnten das SHIFTaus Gründen der Klarheit am Ende des Blocks platzieren, aber das könnte verloren gehen und / oder auch die Leute verwirren. "Erfassen" %~1und %~1außerhalb des Blocks scheint also am besten.
  • Sie möchten keinen Parameter anstelle des optionalen Werts eines anderen Parameters verwenden, müssen dies also überprüfen IF NOT "%ARG:~0,2%" == "--".
  • Achten Sie darauf , nur zu , SHIFTwenn Sie verwenden einen der Parameter.
  • Der doppelte Code SET FOO=%DEFAULT_FOO% ist bedauerlich, aber die Alternative wäre, einen IF "%FOO%" == "" SET FOO=%DEFAULT_FOO%außerhalb des IF NOT "%ARG%" == ""Blocks hinzuzufügen . Da sich dies jedoch noch im IF "%PARAM%" == "--foo"Block befindet, wurde der %FOO%Wert ausgewertet und festgelegt, bevor Sie den Block betreten haben, sodass Sie niemals feststellen würden, dass sowohl der --fooParameter vorhanden war als auch der %FOO%Wert fehlte.
  • Beachten Sie, dass ECHO Missing bar value. 1>&2die Fehlermeldung an stderr gesendet wird.
  • Möchten Sie eine leere Zeile in einer Windows-Batchdatei? Du musst eine ECHO:oder eine der Variationen verwenden.
Garret Wilson
quelle
4

Erstellen Sie eine neue Batch-Datei (Beispiel: openclass.bat) und schreiben Sie diese Zeile in die Datei:

java %~n1

Legen Sie dann die Batch-Datei in den Ordner system32, wechseln Sie zu Ihrer Java-Klassendatei, klicken Sie mit der rechten Maustaste auf Eigenschaften, Öffnen mit ..., suchen Sie Ihre Batch-Datei, wählen Sie sie aus und fertig ...

Für mich geht das.

PS: Ich kann das cmd-Fenster nicht schließen, wenn ich die Java-Klasse schließe. Zur Zeit...

SvenVP
quelle
Sie können das cmd-Fenster schließen, nachdem der Prozess mit dem folgenden Befehl in einem Batch-Skript geschlossen wurde:start /wait java %~n1
Paint_Ninja
1
Es ist unverantwortlich, der Öffentlichkeit zu raten, zufällige Skriptdateien in das System32-Verzeichnis zu stellen. Diese Antwort kratzt wirklich nicht an der Oberfläche des Themas dieses Threads.
Jwdonahue
2

Einfache Lösung (obwohl die Frage alt ist)

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

Ausgabe

YourLocalPath>call "C:\Temp\test.bat" pass123

YourLocalPath>echo off
"Batch started"
"arg1 is pass123"

YourLocalPath>pause
Press any key to continue . . .

Wobei YourLocalPath der aktuelle Verzeichnispfad ist.

Um die Dinge einfach zu halten, speichern Sie den Befehlsparameter in variable und verwenden Sie variable zum Vergleich.

Es ist nicht nur einfach zu schreiben, sondern auch einfach zu warten. Wenn also später eine andere Person oder Sie Ihr Skript nach langer Zeit lesen, ist es leicht zu verstehen und zu warten.

So schreiben Sie Code inline: Siehe andere Antworten.

Amol Patil
quelle
2

Geben Sie hier die Bildbeschreibung ein

Um Schleifen zu verwenden, erhalten Sie alle Argumente und in reinen Batch:

Obs: Für die Verwendung ohne:?*&<>


@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 

Ihr Code ist bereit, etwas mit der Argumentnummer zu tun, wo es benötigt wird, wie ...

 @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
Ich war es nicht
quelle
1
Aber es schlägt fehl, wenn das Passwort ein Zeichen von?*&<>
jeb
@jeb Nochmals vielen Dank, ich habe Anmerkung obs. hinzugefügt : um zu antworten, bis eine neue Bearbeitung für den Umgang mit diesen Zeichen erfolgt ...
Ich war es nicht