Wenn Sie nur einige Shell-Skripte in Batch-Dateien konvertieren, gibt es eine Sache, die ich anscheinend nicht finden kann ... und das ist eine einfache Zählung der Anzahl der Befehlszeilenargumente.
z.B. Wenn Sie haben:
myapp foo bar
In Shell:
- $ # -> 2
- $ * -> foo bar
- $ 0 -> myapp
- $ 1 -> foo
- $ 2 -> bar
Im Batch
- ?? -> 2 <---- welcher Befehl?!
- % * -> foo bar
- % 0 -> myapp
- % 1 -> foo
- % 2 -> bar
Ich habe mich also umgesehen und entweder an der falschen Stelle gesucht oder bin blind, aber ich kann anscheinend keinen Weg finden, um die Anzahl der übergebenen Befehlszeilenargumente zu ermitteln.
Gibt es einen Befehl ähnlich dem "$ #" der Shell für Batch-Dateien?
ps. Das nächste, was ich gefunden habe, ist, die% 1s zu durchlaufen und 'shift' zu verwenden, aber ich muss% 1,% 2 usw. später im Skript erneut referenzieren, damit das nicht gut ist.
shell
batch-file
scripting
pyko
quelle
quelle
2 myapp foo bar
?Antworten:
Wenn Sie ein bisschen googeln, erhalten Sie das folgende Ergebnis von Wikibooks :
Scheint, als hätte sich cmd.exe ein bisschen aus den alten DOS-Tagen entwickelt :)
quelle
for
nur für Argumente funktioniert, die wie Dateinamen aussehen, nicht für Optionszeichenfolgen wie-?
. Die Verwendung von Zitaten (for %%i in ("%*") ...
) funktioniert für Argumente wie-?
, schlägt jedoch für Argumente in Anführungszeichen aufgrund verschachtelter Anführungszeichen fehl. Der einzige robuste Weg scheint zu beinhaltenshift
...MyBatchFile "*.*" "Abc"
berichtet, dass argC == 9. - Downvoted.Sie neigen dazu, die Anzahl der Argumente mit dieser Art von Logik zu behandeln:
etc.
Wenn Sie mehr als 9 Argumente haben, sind Sie jedoch mit diesem Ansatz fertig. Es gibt verschiedene Hacks zum Erstellen von Zählern, die Sie hier finden , aber seien Sie gewarnt, diese sind nichts für schwache Nerven.
quelle
shift
mehr als 9 zählen ... und ohne 10 Zeilen gleich aussehenden Codes.Die folgende Funktion ist
:getargc
möglicherweise genau das, wonach Sie suchen.Grundsätzlich wird die Liste einmal durchlaufen (was für die Funktion lokal ist, damit die Verschiebungen die Liste im Hauptprogramm nicht beeinflussen) und gezählt, bis sie abgelaufen ist.
Es wird auch ein raffinierter Trick verwendet, bei dem der Name der von der Funktion festzulegenden Rückgabevariablen übergeben wird.
Das Hauptprogramm zeigt nur, wie es aufgerufen wird, und gibt die Argumente anschließend wieder, um sicherzustellen, dass sie unberührt bleiben:
quelle
echo Count is %argc%
Sie Ihren eigenen Code einfügen würden, der prüfen könnte, ob diese Zählung korrekt ist, und dann weitermachen .Versuche dies:
quelle
Wenn die Anzahl der Argumente genau sein sollte (kleiner oder gleich 9), können Sie dies auf einfache Weise überprüfen:
quelle
Vermeidet die Verwendung von entweder
shift
oder einesfor
Zyklus auf Kosten der Größe und Lesbarkeit.Ausgabe:
EDIT: Der hier verwendete "Trick" beinhaltet:
Erstellen einer Zeichenfolge, die eine aktuell ausgewertete Befehlszeilenargumentvariable (dh "% 1", "% 2" usw.) darstellt, unter Verwendung einer Zeichenfolge, die bei jeder Schleifeniteration ein Prozentzeichen (
%%
) und einearg_idx
Zählervariable enthält.Speichern dieser Zeichenfolge in einer Variablen
curr_arg_label
.Übergeben Sie sowohl diesen string (
!curr_arg_label!
) als auch den Namen (curr_arg_value
) einer Rückgabevariablen an ein primitives Unterprogrammget_value
.Im Unterprogramm wird der
%1
Wert des ersten Arguments ( ) auf der linken Seite von assign (set
) und der%2
Wert des zweiten Arguments ( ) auf der rechten Seite verwendet. Wenn jedoch das Argument des zweiten Unterprogramms übergeben wird, wird es vom Befehlsinterpreter in den Wert des Befehlszeilenarguments des Hauptprogramms aufgelöst. Das heißt, was übergeben wird, ist beispielsweise nicht "% 4", sondern der Wert, den die vierte Befehlszeilenargumentvariable enthält ("another_arg" in der Beispielverwendung).Anschließend wird die dem Unterprogramm als Rückgabevariable (
curr_arg_value
) gegebene Variable auf Undefiniert getestet. Dies würde passieren, wenn das aktuell ausgewertete Befehlszeilenargument fehlt. Anfänglich war dies ein Vergleich des Werts der Rückgabevariablen in eckigen Klammern mit leeren eckigen Klammern (dies ist die einzige Möglichkeit, wie ich Programm- oder Unterprogrammargumente kenne, die Anführungszeichen enthalten können und ein Überbleibsel aus der Trial-and-Error-Phase waren) wurde da fixiert wie es jetzt ist.quelle
Die letzte Antwort war vor zwei Jahren, aber ich brauchte eine Version für mehr als neun Befehlszeilenargumente. Vielleicht macht auch ein anderer ...
Die Lösung besteht aus den ersten 19 Zeilen und konvertiert alle Argumente in Variablen in einem c-ähnlichen Stil. Alle anderen Dinge prüfen nur das Ergebnis und zeigen die Konvertierung in lokale Argumente. Sie können Argumente in jeder Funktion nach Index referenzieren.
quelle
Eine robuste Lösung besteht darin, das Zählen an eine Unterroutine zu delegieren, die mit aufgerufen wird
call
. Die Unterroutine verwendetgoto
Anweisungen, um eine Schleife zu emulieren, in der dieshift
Argumente (nur Unterroutine) iterativ verwendet werden:quelle