Ich möchte ein Windows-Batch-Gegenstück zu Bash finden, $@
das eine Liste aller an ein Skript übergebenen Argumente enthält.
Oder muss ich mich darum kümmern shift
?
quelle
Ich möchte ein Windows-Batch-Gegenstück zu Bash finden, $@
das eine Liste aller an ein Skript übergebenen Argumente enthält.
Oder muss ich mich darum kümmern shift
?
dancavallaro hat das Recht %*
für alle Befehlszeilenparameter (mit Ausnahme des Skriptnamens selbst). Sie könnten diese auch nützlich finden:
%0
- der Befehl verwendet , um die Batch - Datei aufrufen (könnte foo
, ..\foo
, c:\bats\foo.bat
etc.)
%1
ist der erste Kommandozeilenparameter,
%2
ist der zweite Befehlszeilenparameter,
und so weiter , bis %9
(und SHIFT
kann für diejenigen , die nach dem 9. verwendet werden).
%~nx0
- Der tatsächliche Name der Batchdatei, unabhängig von der aufrufenden Methode (some-batch.bat)
%~dp0
- Laufwerk und Pfad zum Skript (d: \ scripts)
%~dpnx0
- ist der vollständig qualifizierte Pfadname des Skripts (d: \ scripts \ some) -batch.bat)
Weitere Infobeispiele unter https://www.ss64.com/nt/syntax-args.html und https://www.robvanderwoude.com/parameters.html
%~dpn0
das Laufwerk und der Pfad zum Skript sowie der Name der Batchdatei zurückgegeben werden, nicht jedoch die Erweiterung. Ich fand dies besonders nützlich beim Erstellen von Batch-Skripten, die eine.ps1
Datei mit demselben Namen aufrufen . Im Wesentlichend
bezieht sich das auf das Laufwerk,p
auf den Pfad,n
auf den Namen der Datei undx
auf die Erweiterung. Mit diesen Informationen können Sie ziemlich viel tun.@echo %~n0.my_ext
%*
scheint alle an das Skript übergebenen Argumente zu enthalten.quelle
&
? Wenn ich versuche, mehrere Pfade mehrerer ausgewählter Dateien abzurufen (über das Menü Senden an und "% *", die die Argumente an eine .py-Datei übergeben), wird die Auflistung bei & caracters gestoppt. Wenn zum Beispiel die zweite Datei ein&
in ihrem Namen enthält, wird der Teil des Namens nach dem&
übersprungen, und auch die verbleibenden Dateien.)&
ist ein Sonderzeichen, das bedeutetstop this command and start another one
. Ein Dateiname mit einem&
MUSS angegeben werden.%1
...%n
und%*
enthält die Argumente, aber es kann schwierig sein, darauf zuzugreifen, da der Inhalt interpretiert wird.Daher ist es unmöglich, so etwas mit normalen Aussagen zu handhaben
Jede Zeile schlägt fehl, da cmd.exe versucht, eines der kaufmännischen Und-Zeichen auszuführen (der Inhalt von% 1 ist
"&"&
).Es gibt jedoch eine Problemumgehung mit einer temporären Datei
Der Trick besteht darin
echo on
, die%1
After-rem
Anweisung zu aktivieren und zu erweitern (funktioniert auch mit% 2 ..% *). Umdie Ausgabe von umleiten zu können
echo on
, benötigen Sie die beiden FOR-LOOPS.Die zusätzlichen Zeichen
* #
werden verwendet, um gegen Inhalte wie/?
(würde die Hilfe für REM zeigen) sicher zu sein .Oder ein Caret ^ am Zeilenende könnte als mehrzeiliges Zeichen fungieren.
Das FOR / F sollte mit verzögerter Erweiterung arbeiten, sonst Inhalt mit "!" würde zerstört werden.
Nachdem Sie die zusätzlichen Zeichen entfernt haben, haben
param1
Sie sie erhalten.param1
Aktivieren Sie die verzögerte Erweiterung, um eine sichere Verwendung zu gewährleisten.Bearbeiten: Eine Bemerkung zu% 0
%0
enthält den Befehl zum Aufrufen des Stapels, wobei auch die Groß- / Kleinschreibung wie inFoO.BaT
Aber nach einem Aufruf einer Funktion beibehalten wird,
%0
und%~0
enthält auch den Funktionsnamen (oder besser die Zeichenfolge, die zum Aufrufen der Funktion verwendet wurde).Aber mit können
%~f0
Sie immer noch den Dateinamen abrufen.Ausgabe
quelle
%~f0
Trick ist völlig unerwartet, sehr cool und möglicherweise sehr nützlich :-) Es überrascht nicht, dass die anderen Modifikatoren auf die gleiche Weise funktionieren und immer mit der übergeordneten Batchdatei arbeiten, selbst wenn sie sich in einer aufgerufenen Unterroutine befinden. Dies scheint eine eigene Frage und Antwort wert zu sein - "Wie kann man in einem aufgerufenen Unterprogramm auf den Namen des laufenden Stapels zugreifen?"Ich habe das beim nächsten Mal gefunden, wenn Sie diese Informationen nachschlagen müssen. Anstatt einen Browser zu öffnen und zu googeln, können Sie einfach
call /?
Ihr cmd eingeben und Sie erhalten es:quelle
Der Weg, um alle Argumente in ein Skript abzurufen, ist hier:
quelle
%%I
sich interpretieren und brechen Sie möglicherweise Ihr Skript.Hier ist eine ziemlich einfache Möglichkeit, die Argumente abzurufen und als env-Variablen festzulegen. In diesem Beispiel werde ich sie nur als Schlüssel und Werte bezeichnen.
Speichern Sie das folgende Codebeispiel als "args.bat". Rufen Sie dann die Batchdatei auf, die Sie über eine Befehlszeile gespeichert haben. Beispiel: arg.bat --x 90 --y 120
Ich habe einige Echo-Befehle bereitgestellt, um Sie durch den Prozess zu führen. Das Endergebnis ist jedoch, dass --x einen Wert von 90 und --y einen Wert von 120 hat (wenn Sie das Beispiel wie oben angegeben ausführen ;-)).
Sie können dann die bedingte Anweisung 'if defined' verwenden, um zu bestimmen, ob Ihr Codeblock ausgeführt werden soll oder nicht. Sagen wir also run: "arg.bat --x hello-world" Ich könnte dann die Anweisung "IF DEFINED --x echo% - x%" verwenden und die Ergebnisse wären "hallo-world". Es sollte sinnvoller sein, wenn Sie den Stapel ausführen.
quelle
Obs: Für die Verwendung ohne:
?*&<>
quelle
Der folgende Code simuliert ein Array ('
params
') - nimmt die vom Skript empfangenen Parameter und speichert sie in den Variablenparams_1
..params_n
, wobein
=params_0
= die Anzahl der Elemente des Arrays:quelle
Wenn Sie Parameter in Anführungszeichen haben, die Leerzeichen enthalten,
%*
funktioniert dies nicht richtig. Die beste Lösung, die ich gefunden habe, ist eine Schleife, die alle Argumente verbindet: https://serverfault.com/a/22541quelle
Sie können
For
Commad verwenden, um eine Liste von Arg zu erhalten.Hilfe:
For /?
Hilfe:Setlocal /?
Hier ist mein Weg =
Benötigen Sie keinen Shift-Befehl.
quelle
quelle
Viele der oben genannten Informationen führten mich zu weiteren Nachforschungen und letztendlich zu meiner Antwort. Deshalb wollte ich dazu beitragen, was ich in der Hoffnung getan habe, dass es jemand anderem hilft:
Ich wollte auch eine unterschiedliche Anzahl von Variablen an eine Batch-Datei übergeben, damit sie innerhalb der Datei verarbeitet werden können.
Ich war damit einverstanden, sie mit Anführungszeichen an die Batch-Datei zu übergeben
Ich möchte, dass sie ähnlich wie unten verarbeitet werden - aber mit einer Schleife, anstatt manuell zu schreiben:
Also wollte ich folgendes ausführen:
Und über die Magie von for-Schleifen tun Sie dies in der Batch-Datei:
Das Problem, das ich hatte, war, dass alle meine Versuche, eine for-Schleife zu verwenden, nicht funktionierten. Das folgende Beispiel:
würde einfach tun:
und nicht:
auch nach dem einstellen
Grund war, dass die for-Schleife die gesamte Zeile gelesen und meinen zweiten Parameter während der ersten Iteration der Schleife %% B zugewiesen hat. Da% * alle Argumente darstellt, muss nur eine einzige Zeile verarbeitet werden - daher geschieht nur ein Durchgang der for-Schleife. Es stellt sich heraus, dass dies beabsichtigt ist, und meine Logik war falsch.
Also habe ich aufgehört, eine for-Schleife zu verwenden, und vereinfacht, was ich versucht habe, indem ich if, shift und eine goto-Anweisung verwendet habe. Ich bin damit einverstanden, dass es ein bisschen hackt, aber es passt besser zu meinen Bedürfnissen. Ich kann alle Argumente durchlaufen und dann eine if-Anweisung verwenden, um die Schleife zu verlassen, sobald ich sie alle verarbeitet habe.
Die gewinnende Aussage für das, was ich erreichen wollte:
UPDATE - Ich musste stattdessen das Folgende ändern. Ich habe alle Umgebungsvariablen verfügbar gemacht, als ich versucht habe, auf% 1 zu verweisen und Shift auf diese Weise zu verwenden:
quelle
Manchmal muss ich mehrere Befehlszeilenparameter extrahieren, aber nicht alle und nicht aus dem ersten. Nehmen wir den folgenden Aufruf an:
Natürlich wird die Erweiterung ".bat" nicht benötigt, zumindest haben Sie test.exe im selben Ordner. Was wir wollen, ist die Ausgabe "tres cuatro cinco" (egal ob eine oder drei Zeilen). Das Ziel ist, dass nur ich drei Parameter benötige und mit dem dritten beginne. Um ein einfaches Beispiel zu haben, ist die Aktion für jedes nur "Echo", aber Sie können in einer anderen komplexeren Aktion über die ausgewählten Parameter nachdenken.
Ich habe einige Beispiele (Optionen) erstellt, damit Sie sehen können, welches für Sie besser ist. Leider gibt es keinen schönen (oder ich weiß nicht) Weg, der auf einer for-Schleife über den Bereich wie "für %% i in (% 3, 1,% 5)" basiert.
Wahrscheinlich können Sie mehr Optionen finden oder mehrere kombinieren. Genieße sie.
quelle
Windows-Version (benötigt jedoch Socat)
Einrichten:
quelle