调用一个变量,该变量的值是另一个变量的名称

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!现在我将阅读一些关于为什么不完全理解“呼叫”的目的。

以上是关于调用一个变量,该变量的值是另一个变量的名称的主要内容,如果未能解决你的问题,请参考以下文章

实验11——指针的基础应用

MATLAB 函数的一个输入变量是另一个函数

指针和引用的区别

在JMeter中的另一个用户定义变量中使用用户定义变量的值

线程之间如何调用变量

获取系统环境变量-GetEnvironmentVariable