Пакет: Неожиданные переменные результаты в подпрограмме

Пакет: Неожиданные переменные результаты в подпрограмме

Ответ напредыдущий вопроспредлагает эту строку 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 (")
    

Связанный контент