Используйте переменную цикла for для вызова предопределенной переменной - PullRequest
0 голосов
/ 13 марта 2019

Я хочу использовать переменную, которая определена внутри цикла 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:\Users\username\AppData\Local\slack\slack.exe
Text=C:\textfile.txt
Program=C:\program.bat & C:\program_license.txt

1 Ответ

3 голосов
/ 14 марта 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...