调用一个变量,该变量的值是另一个变量的名称
Posted
技术标签:
【中文标题】调用一个变量,该变量的值是另一个变量的名称【英文标题】:Recalling a variable which value is the name of another variable 【发布时间】:2021-08-22 04:21:38 【问题描述】:我编写了一个脚本来从 .csv 日志中提取特定事件数据。
2021_06_04 09:00.00, online, Serial#001, 50.10.10.10 2021_06_04 09:01.00, online, Serial#002, 50.10.10.11 2021_06_04 09:01.00, read, Serial#002, apples, clear 2021_06_04 09:01.00, online, Serial#003, 50.10.10.12 2021_06_04 09:01.00, offline, Serial#001 2021_06_04 09:02.00, read, Serial#002, bananas, clear 2021_06_04 09:03.00, read, Serial#003, apples, reject 2021_06_04 09:04.00, read, Serial#002, apples, clear 2021_06_04 09:05.00, read, Serial#003, apples, clear
首先我找到所有联机的机器,并将它们的 IP 地址存储到以它们的序列号命名的变量中
for /f "delims=, tokens=3,4" %%a in (
'type "Log.csv"^|findstr "online"'
) do (
set %%a=%%b
现在这已按预期分配变量,如下所示
%Serial001% = 50.10.10.10 %Serial002% = 50.10.10.11 %Serial003% = 50.10.10.12
现在我想找到每台机器的每个“读取”事件。计算事件数以创建“变量集”
set /p Search=Search:
set EventCount = 0
for /f "delims=, tokens=1,3,5" %%a in (
'type "Log.csv"^|findstr "read"^|findstr %search%'
) do (
set /a EventCount+=1
call set EventTime[%%EventCount%%]=%%a
call set Machine[%%EventCount%%]=%%b
call set Decision[%%BagCount%%]=%%c
)
set TotalCount=%EventCount%
现在我可以显示每个数据集,使用“选择”滚动事件计数
百万美元的问题!
在第二行,我想添加存储在变量中的机器 IP 地址,以机器命名...
%%Machine%%
正在输出%Serial#002%
echo. Search: %search%
echo. Machine: !Machine[%EventCount%]! on %%Machine%%
echo Decision: !Decision[%BagCount%]! @ !EventTime[%EventCount%]!
echo.
echo. %EventCount% of %TotalCount%
预期输出
Search: Apples Machine: Serial#002 on 50.10.10.10 Decision: Clear @ 2021_06_04 09:01.00 1 of 4
如何通过展开以变量命名的变量来显示 IP 地址...
我尝试了所有延迟扩展的组合,但都没有运气。我还想为其他功能调用此 IP 地址,而不仅仅是显示目的。
任何方向都将不胜感激!!
【问题讨论】:
【参考方案1】:你已经知道诀窍了 - 使用CALL %%...%%
call echo. Machine: %%!Machine[%EventCount%]!%% on %%Machine%%
顺便说一句。 本块:
call set EventTime[%%EventCount%%]=%%a
call set Machine[%%EventCount%%]=%%b
call set Decision[%%BagCount%%]=%%c
应该改为
set EventTime[!EventCount!]=%%a
set Machine[!EventCount!]=%%b
set Decision[!BagCount!]=%%c
因为,CALL
要慢得多。
CALL
命令有效,因为它会重新启动批处理解析器,并且会发生 1% 的扩展,但它也有一些不需要的副作用,例如加倍/删除插入符号和评估特殊字符(如 &|<>
)。
所以一行像
call set EventTime[%%EventCount%%]=%%a
如果%%a
包含Cat&Dog
,则会失败
【讨论】:
一定要加SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
。
辛苦了,谢谢 Jeb!现在我将阅读一些关于为什么不完全理解“呼叫”的目的。以上是关于调用一个变量,该变量的值是另一个变量的名称的主要内容,如果未能解决你的问题,请参考以下文章