Nachdem ich viele Jahre lang Batchdateien verwendet habe, war ich überrascht, als ich feststellte, dass das Gleichheitszeichen "=" als Argumenttrennzeichen gilt.
Mit diesem Testskript:
echo arg1: %1
echo arg2: %2
echo arg3: %3
und eine Aufforderung:
test.bat a=b c
ist die Ausgabe:
arg1: a
arg2: b
arg3: c
Warum ist das so und wie kann man es vermeiden? Ich möchte nicht, dass der Benutzer des Skripts diese Eigenart berücksichtigt und "a=b" zitiert, was kontra-intuitiv ist.
Dieses Batch-Skript wurde unter Windows 7 ausgeführt.
\===== EDIT =====
Ein wenig mehr Hintergrund: Ich stieß auf dieses Problem, als ich eine Bat-Datei zum Starten einer Java-Anwendung schrieb. Ich wollte einige Args in der Bat-Datei verbrauchen und dann den Rest an die Java-Anwendung weitergeben. Mein erster Versuch war also, Folgendes zu tun shift
und bauen dann die Args-Liste neu auf (da %*
wird nicht beeinflusst von shift
). Es sah in etwa so aus, und da habe ich das Problem entdeckt:
rem Rebuild the args, %* does not work after shift
:args
if not "%1" == "" (
set ARGS=!ARGS! %1
shift
goto args
)
Der nächste Schritt bestand darin, die Umschaltfunktion nicht mehr zu verwenden, sondern sie von Hand zu implementieren, indem ein Zeichen nach dem anderen aus %*
bis ein Leerzeichen auftaucht:
rem Remove the 1st arg if it was the profile
set ARGS=%*
if not "%FIRST_ARG%" == "%KNOA_PROFILE%" goto remove_first_done
:remove_first
if not defined ARGS goto remove_first_done
if "%ARGS:~0,1%" == " " goto remove_first_done
set ARGS=%ARGS:~1%
goto remove_first
:remove_first_done
Aber das ist hässlich und könnte in einigen Fällen, die ich nicht bedacht habe, immer noch scheitern. Also beschloss ich schließlich, ein Java-Programm zu schreiben, um die Argumente zu parsen! In meinem Fall ist das in Ordnung, da ich einen Server starte und der Nachteil eines zusätzlichen Java-Aufrufs minimal ist. Es ist verblüffend, was man am Ende manchmal tut.
Sie fragen sich vielleicht, warum ich mich nicht um die Args in der Java-Anwendung selbst gekümmert habe? Die Antwort ist, dass ich in der Lage sein möchte, JVM-Optionen wie -Xmx zu übergeben, die vor dem Aufruf von java verarbeitet werden müssen.