使用for循环变量调用预定义变量

时间:2019-03-13 12:43:04

标签: batch-file for-loop variables

我正在寻找使用一个在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 个答案:

答案 0 :(得分:3)

我不喜欢使用注释中描述的CALL hack,因为1)它相对较慢,并且2)它导致了额外的一轮解析,可能需要额外的转义(这里不是问题)。更糟糕的是,它会破坏引用的^-"^"变成"^^",并且没有任何转义序列可以防止这种情况。

我的解决方案是添加一个额外的FOR循环,以便可以进行扩展。

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

这肯定比CALL hack更为冗长,但是它是一个很好的学习代码模式,因为它更通用。