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
batch-file
arguments
Keng
quelle
quelle
Antworten:
Ein weiterer nützlicher Tipp ist
%*
"alle". Zum Beispiel:Wenn Sie laufen:
Die obige Batch-Datei wird ausgeführt:
Ich kann die Syntax etwas falsch haben, aber das ist die allgemeine Idee.
quelle
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.fake-command /u admin /p password admin password foo bar
. Darauf hat @Joey vor vielen Jahren hingewiesen.So habe ich es gemacht:
So sieht der Befehl aus:
Das
%1
gilt 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.quelle
echo %1 %2
einfachsten Fall mit a@
und afake-command
mit Params gesucht und ihn weggeworfen, weil Sie dachten, wir würdenfake-command.bat
später den Inhalt bekommen (in diesem Fall der überkompliziert müssenfake-command.bat
möglicherweiseecho %2 %4
die Parameternamen ignoriert werden). Falsch, doofus. TL; DR: Sei nicht so dumm wie ich. 1.echo echo %1 %2 > test.bat
2test word1 word2
.. 3. Gewinn.Wenn Sie fehlende Parameter intelligent behandeln möchten, können Sie Folgendes tun:
quelle
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.Die Linien erweitern sich zu
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.
Der Trick besteht darin
echo on
,% 1 nach einerrem
Anweisung 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 zeigenREM
) sicher zu sein .Oder ein Caret ^ am Zeilenende könnte auch nach a als mehrzeiliges Zeichen fungieren
rem
.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 in
param1
, haben Sie es bekommen.param1
Aktivieren Sie die verzögerte Erweiterung, um eine sichere Verwendung zu gewährleisten.quelle
&
, Ihre Lösung funktioniert nur mit einfachen Inhaltentest.bat ^&
und es schlägt fehl. Funktioniert nurtest.bat "&"
, aber das war nicht mein Punkt. Sie können nicht verwenden%*
,%1
auf sichere Weise ohne die REM - Technik&
und auch Anführungszeichen"
Ja, und vergessen Sie nicht, Variablen wie
%%1
beiif
und zu verwendenfor
und die Bande zu verwenden.Wenn Sie das Double vergessen
%
, ersetzen Sie (möglicherweise null) Befehlszeilenargumente und erhalten einige ziemlich verwirrende Fehlermeldungen.quelle
if
undfor
?for %%d in (*) do echo %%d
Von der Kommandozeile:for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
in einer Batch-Datei, erzeugt,testing 1
wenn es mit 1 (test 1
) aufgerufen wird .%%1
greift nicht auf ein Befehlszeilenargument zu und ist auch für denIF
Befehl falsch . Nur derFOR
Befehl (in Batch-Dateien) erfordert doppelte Prozentsätze, würde aber selbst dann%%1
einen FOR-Parameter definieren und nicht auf Argumente zugreifenEs besteht keine Notwendigkeit, dies zu komplizieren. Es ist einfach Befehl% 1% 2 Parameter, zum Beispiel,
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:
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
Q
Parameter weg .quelle
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:
Der jist davon ist mit den
:init
,:parse
und:main
Funktionen.quelle
Hinweis: IF
"%1"==""
verursacht Probleme, wenn%1
es in Anführungszeichen eingeschlossen ist.Verwenden Sie in diesem Fall stattdessen
IF [%1]==[]
oder in NT 4 (SP6) und höherIF "%~1"==""
.quelle
Lassen Sie uns das einfach halten.
Hier ist die .cmd-Datei.
Hier sind 3 Anrufe von der Kommandozeile.
quelle
Dies durchläuft die Stapelparameter (% *), entweder in Anführungszeichen oder nicht, und gibt dann jeden Parameter wieder.
quelle
test.bat *.txt
,test.bat cat^&dog
oderTest.bat /?
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
könnte die Variablen nach dem Aufruf der Funktion verwenden:Hier ist die Funktion:
Einschränkungen
-force
. Sie könnten verwenden,-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
-
Vor-Parametern gesucht wird.quelle
In Batch-Datei
Und in der Kommandozeile übergeben Sie das Argument
Ausgabe wird sein
quelle
Um auf eine festgelegte Variable in der Befehlszeile zu verweisen, müssten Sie beispielsweise Folgendes verwenden
%a%
:Hinweis: Dies funktioniert unter Windows 7 Pro.
quelle
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,--foo
der einen optionalen Wert annimmt (der natürlich kein anderer Parameter sein kann). Wenn der Wert fehlt, wird standardmäßig verwendetdefault
. Es hat auch einen optionalen Parameter,--bar
der 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:
Hier ist eine Lösung:
SETLOCAL
Option, damit die Variablen nicht in die aufrufende Umgebung gelangen.SET FOO=
usw. zu initialisieren , falls jemand sie in der aufrufenden Umgebung definiert hat.%~1
diese Option , um Anführungszeichen zu entfernen.IF "%ARG%" == ""
und nichtIF [%ARG%] == []
weil[
und]
spielen Sie überhaupt nicht mit Werten, die in einem Leerzeichen enden.SHIFT
in einemIF
Block befinden, werden die aktuellen Argumente wie z. B.%~1
nicht aktualisiert, da sie bestimmt werden, wenn dasIF
analysiert wird. Sie könnten%~1
und%~2
innerhalb desIF
Blocks verwenden, aber es wäre verwirrend, weil Sie eine hattenSHIFT
. Sie könnten dasSHIFT
aus Gründen der Klarheit am Ende des Blocks platzieren, aber das könnte verloren gehen und / oder auch die Leute verwirren. "Erfassen"%~1
und%~1
außerhalb des Blocks scheint also am besten.IF NOT "%ARG:~0,2%" == "--"
.SHIFT
wenn Sie verwenden einen der Parameter.SET FOO=%DEFAULT_FOO%
ist bedauerlich, aber die Alternative wäre, einenIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%
außerhalb desIF NOT "%ARG%" == ""
Blocks hinzuzufügen . Da sich dies jedoch noch imIF "%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--foo
Parameter vorhanden war als auch der%FOO%
Wert fehlte.ECHO Missing bar value. 1>&2
die Fehlermeldung an stderr gesendet wird.ECHO:
oder eine der Variationen verwenden.quelle
Erstellen Sie eine neue Batch-Datei (Beispiel: openclass.bat) und schreiben Sie diese Zeile in die Datei:
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...
quelle
start /wait java %~n1
Einfache Lösung (obwohl die Frage alt ist)
Test1.bat
CallTest1.bat
Ausgabe
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.
quelle
Obs: Für die Verwendung ohne:
?*&<>
quelle
?*&<>