Используйте переменную цикла for для вызова предопределенной переменной

#batch-file #for-loop #variables

#пакетный файл #for-loop #переменные

Вопрос:

Я хочу использовать переменную, которая определяется внутри цикла for, и использовать ее для вызова предопределенной переменной.

Например: Для запуска программы "Slack" мне нужно вызвать переменную %Slack% . Пакетный файл примет ваш ввод, поэтому, если я введу "Slack" , переменная !filename[%%i]! будет назначена "Slack" . Как только это будет сделано, я хочу вызвать, %Slack% используя !filename[%%i]! . Согласно логике: %!filename[%%i]!%

Использование %!filename[%%i]!% приведет к аварийному завершению работы пакетного файла и его закрытию.

Установка set file=!filename[%%i]! и запуск ее с %file% ничего не вернут.

Какой-нибудь хитрый трюк?

 @echo off

setlocal EnableDelayedExpansion

:: Predefined variables
for /f "delims== tokens=1,2" %%G in (D:programs.txt) do set %%G=%%H

set /P "filenames=Enter programs to install: "

:: Puts input into array
set n=0
for %%a in (%filenames%) do (
    set /A n =1
    set "filename[!n!]=%%~a"
)

:: Run variables imported from programs.txt
for /L %%i in (1,1,%n%) do (

    :: This is where I want !filename[%%i]! to be called as %!filename[%%i]!%

)

pause
endlocal
  

program.txt пример

 Slack=C:UsersusernameAppDataLocalslackslack.exe
Text=C:textfile.txt
Program=C:program.bat amp; C:program_license.txt
  

Комментарии:

1. Было бы полезно, если бы в текст вашего вопроса вы также включили (отформатированный как код) пример содержимого D:programs.txt .

2. Ничего не «вылетает»; откройте окно командной строки и запустите пакетный файл оттуда, введя его путь / имя; затем вы сможете увидеть любые сообщения об ошибках; также временно удалите @echo off и проверьте все эхо-сигналы команд. В любом случае, %!variable!% это не имеет смысла, если у вас нет вызываемой переменной !variable! (включая ! , что здесь не так); почему !variable! это недостаточно хорошо для вас?

3. @aschipfl потому что !variable! возвращает только Slack . С помощью этой возвращаемой строки я хочу каким-то образом использовать ее для вызова %Slack% переменной (определенной из programs.txt в строке 6).

4. CALL echo %%!filename[%%i]!%% или CALL START "" %%!filename[%%i]!%%

5. Основываясь на предоставленном вами примере, ваш начальный For цикл может выглядеть следующим образом: For /F "UseBackDelims=" %%A In ("D:programs.txt")Do Set "%%A"

Ответ №1:

Мне не нравится использовать способ взлома вызовов, описанный в комментариях, потому что 1) он относительно медленный и 2) это вызывает дополнительный раунд синтаксического анализа, который может потребовать дополнительного экранирования (здесь это не проблема). Что еще хуже, это приведет к повреждению заключенного в кавычки ^ "^" becomes "^^" , и нет escape-последовательности, которая может предотвратить это.

Мое решение — добавить дополнительный цикл FOR, чтобы расширение можно было выполнять поэтапно.

 for /L %%i in (1,1,%n%) do for %%A in ("!filename[%%i]!") do echo !%%~A!
  

Это, безусловно, более подробно, чем способ взлома вызова, но это хороший шаблон кода для изучения, потому что он более универсально применим.

Комментарии:

1. Также отлично работает. Заменил ее этим. Спасибо