
Eine Antwort aufeine vorherige Frageschlägt diese FOR-Zeile vor. Jetzt versuche ich, die Variable zu verwenden. Mein aktuelles Batch-Skript:
@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 %%G
:sub1
echo %%G
set apath=%%~G
echo %apath%
goto :eof
:End
Die Ausgabe dieses Skripts besteht aus sieben Iterationen davon:
%G
%~G
Die Subroutine scheint etwas mit der Variable zu tun. Denn wenn ich diese Zeilen ersetze:
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do (
echo %%G
set apath=%%~G
echo %apath%
)
Ich erhalte das gewünschte Ergebnis: sechs Ausgabepaare dieser Art:
"3D Objects"
3D Objects
wobei die Tilde wie erwartet die Anführungszeichen entfernt.
Im ersten Codebeispiel lässt die Produktion von sieben (nicht sechs) Paaren von Ausgabezeilen darauf schließen, dass die Subroutine die Anführungszeichen ignoriert und "3D" und "Objekte" als zwei separate Elemente darstellt - ein Problem, das indie vorherige Frage.
Ich habe angefangen, an dem Subroutinenansatz herumzubasteln, weil ich mit dem einfacheren Ansatz, der im zweiten Codebeispiel (oben) dargestellt ist, Probleme hatte, ein bestimmtes Ergebnis zu erzielen. Möglicherweise könnte eine verzögerte Erweiterung das Problem beheben, allerdings auf Kosten zusätzlicher Komplexität. Nicht zu leugnen, dass die Zeile „goto :eof“ der Subroutine auch ein wenig verwirrend ist, selbst wenn sie funktioniert.
Meine konkrete Frage ist, was mit der Variable schief läuft, wenn sie in der Subroutine verwendet wird. Aber wenn es einen besseren Weg gibt, würde ich mich auch zumindest über einen Link in diese Richtung freuen.
Antwort1
Sie übergeben den Wert derfürSchleifeniteration zu einem Unterprogramm mitAnrufSie möchten dies (Platzhalter für übergebene Variablen) also in doppelte Anführungszeichen einschließen und dann innerhalb dieser Subroutine auf die übergebene Variable verweisen oder %1
die %~1
einschließenden doppelten Anführungszeichen entfernen.
Die Verwendung von GOTO :EOF
am Ende jeder aufgerufenen Subroutine gibt die Kontrolle an die ursprünglich aufrufende Subroutine zurück, sodass diese gegebenenfalls nach dem call
Befehl mit der Verarbeitung ihrer restlichen Logik fortfahren kann.
@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 "%%~G"
goto :eof
:sub1
echo %1
set apath=%~1
echo %apath%
goto :eof
:End
Ausgabe
"3D Objects"
3D Objects
"Documents"
Documents
"Downloads"
Downloads
"Music"
Music
"Pictures"
Pictures
"Videos"
Videos
Unterstützende Ressourcen
- FÜR
Befehlszeilenargumente (Parameter)
Argumente können auch an eine Subroutine übergeben werden mit
CALL:
CALL :my_sub 2468
Sie können den Wert jedes Arguments mit einem % gefolgt von seiner numerischen Position in der Befehlszeile abrufen. Das erste übergebene Element ist immer %1, das zweite immer
%2
und so weiter.%*
In einem Batch-Skript werden alle Argumente (z. B.%1 %2 %3 %4 %5
...%255
) auf „+“ verwiesen. Nur%1
auf Argumente%9
kann per Nummer verwiesen werden.-
Übergabe per Referenz
Neben der Übergabe von numerischen oder Zeichenfolgenwerten auf der Kommandozeile ist es auch möglich,VariableName und verwenden Sie dann die Variable, um Daten zwischen Skripten oder Unterprogrammen zu übertragen. Die Übergabe per Referenz ist eine etwas fortgeschrittenere Technik, kann aber besonders nützlich sein, wenn die Zeichenfolge Zeichen enthält, die CMD-Trennzeichen oder Anführungszeichen sind.
Rufen Sie eine Subroutine auf (:label)
Der
CALL
Befehl übergibt die Steuerung an die Anweisung nach dem angegebenen Label sowie an alle angegebenen Parameter.Um das Unterprogramm zu verlassen, geben Sie Folgendes ein:GOTO :eof
Die Steuerung wird an das Ende des aktuellen Unterprogramms übertragen.. CALL /?
CALL command now accepts labels as the target of the CALL. The syntax is: CALL :label arguments In addition, expansion of batch script argument references (%0, %1, etc.) have been changed as follows: %* in a batch script refers to all the arguments (e.g. %1 %2 %3 %4 %5 ...) Substitution of batch parameters (%n) has been enhanced. You can now use the following optional syntax: %~1 - expands %1 removing any surrounding quotes (")