
Ответ напредыдущий вопроспредлагает эту строку FOR. Теперь я пытаюсь использовать переменную. Мой пакетный скрипт в настоящее время:
@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
Результатом работы этого скрипта являются семь его итераций:
%G
%~G
Подпрограмма, похоже, что-то делает с переменной. Потому что когда я подставляю эти строки:
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do (
echo %%G
set apath=%%~G
echo %apath%
)
Я получаю желаемый результат: шесть пар вывода такого рода:
"3D Objects"
3D Objects
где тильда удаляет кавычки, как и ожидалось.
В первом примере кода создание семи (а не шести) пар выходных строк предполагает, что подпрограмма может игнорировать кавычки, представляя «3D» и «Объекты» как два отдельных элемента — эта проблема была рассмотрена впредыдущий вопрос.
Я начал возиться с подходом подпрограммы, потому что у меня возникли проблемы с достижением определенного результата с помощью более простого подхода, представленного во втором примере кода (выше). Возможно, отложенное расширение исправит это, но ценой дополнительной сложности. Не отрицаю, что строка подпрограммы "goto :eof" также немного сбивает с толку, даже если она работает.
Мой конкретный вопрос: что не так с переменной, когда она используется в подпрограмме? Но если есть способ получше, я был бы также признателен хотя бы за ссылку в этом направлении.
решение1
Вы передаете значениедляитерация цикла в подпрограмме с использованиемвызовпоэтому вы хотите заключить это (заполнитель переданной переменной) в двойные кавычки, а затем сослаться на переданную переменную внутри этой подпрограммы как %1
или %~1
удалить заключающие в себе двойные кавычки.
Использование GOTO :EOF
в конце каждой вызываемой подпрограммы передаст управление обратно исходной вызывающей подпрограмме, чтобы она могла продолжить обработку оставшейся части своей логики, если это применимо после команды call
.
@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
Выход
"3D Objects"
3D Objects
"Documents"
Documents
"Downloads"
Downloads
"Music"
Music
"Pictures"
Pictures
"Videos"
Videos
Поддерживающие ресурсы
- ДЛЯ
Аргументы командной строки (параметры)
Аргументы также можно передавать в подпрограмму с помощью
CALL:
CALL :my_sub 2468
Вы можете получить значение любого аргумента, используя %, за которым следует его числовая позиция в командной строке. Первый переданный элемент всегда %1, второй элемент всегда
%2
и т. д.%*
в пакетном скрипте ссылается на все аргументы (например,%1 %2 %3 %4 %5
...%255
), только на аргументы%1
можно%9
ссылаться по номеру.-
Передача по ссылке
Помимо передачи числовых или строковых значений в командной строке, также можно передатьпеременнаяимя, а затем использовать переменную для передачи данных между скриптами или подпрограммами. Передача по ссылке — немного более продвинутая техника, но она может быть особенно полезна, когда строка содержит символы, которые являются разделителями CMD или кавычками.
ВЫЗОВ подпрограммы (:label)
Команда
CALL
передаст управление оператору, указанному после метки, вместе со всеми указанными параметрами.Для выхода из подпрограммы укажите,GOTO :eof
что это передаст управление в конец текущей подпрограммы.. 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 (")