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

问题描述 投票:0回答:1

我希望使用一个在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
batch-file for-loop variables
1个回答
3
投票

我不喜欢使用评论中描述的CALL黑客,因为1),它相对较慢,2)它导致额外的解析,可能需要额外的转义(这里不是问题)。更糟糕的是,它会腐败引用^ - "^"变成"^^",并且没有逃脱序列可以阻止这种情况。

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

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

这肯定比CALL黑客更冗长,但它是一个很好的代码模式,因为它更普遍适用。

© www.soinside.com 2019 - 2024. All rights reserved.