#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. Также отлично работает. Заменил ее этим. Спасибо