批处理脚本 - 在 For 循环中创建动态变量名称或数组

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

我想请问您是否可以提供建议。

我不知道是否可以批量或数组或类似的方式创建动态变量名称。例如,在 for 循环之前设置 c=0,然后在 for 循环内设置 c = c+1 并使用该数字在 for 循环内创建动态变量名称,例如: set entry%c% = 'somestring'

然后使用这些编号变量在 for 循环外部打印输出,例如: 回显%条目1% 回显%entry2%

示例:

@echo off

set /a c=1

for %%i in (list.txt) do (

set /a c=c+1
set entry%c% = %%i

)

echo %entry1%
echo %entry2%

感谢您的帮助。

arrays variables batch-file dynamic names
3个回答
3
投票

我会用

for /f "tokens=1*delims=[]" %%a in ('find /n /v "" list.txt') do set "entry%%a=%%b"

但有一点警告

set entry%c% = %%i

批处理对

SET
语句中的空格敏感。如果这个有效,它会将名为“entry1Space”的变量设置为“Spacethefirstlineofthefile”的值。

我使用的

set "var=value"
语法可确保批处理行上的任何尾随空格不包含在分配给
var
的值中。


3
投票

您需要使用延迟扩展变量,否则

c
将始终扩展为相同的值。

您还需要删除 set 语句中的空格。

set entry%c% = %%i
将创建一个名为(例如)
entry1<space>
的变量,您必须像这样扩展它 -
%entry1 %
。因此,只需删除
=
运算符周围的空格即可。

@echo off

setLocal enableDelayedExpansion
set c=0

for %%i in (list.txt) do (
    set /a c+=1
    set entry!c!=%%i
)

echo %entry1%
echo %entry2%

此外,如果您想循环访问您创建的所有变量,您可以执行如下操作。

for /L %%i in (!c!, -1, 1) do echo !entry%%i!

for /L %%i in (1, 1, !c!) do echo !entry%%i!

0
投票

这是我用来列出已连接的 adb 设备的片段。它将每个设备分配给一个名为“device[n]”的动态变量,其中 n 是索引,1 是列表中第一个设备的索引。

setlocal enabledelayedexpansion
set i=0
set sum_of_devices=0

REM get list of connected devices
for /f "eol=L tokens=1" %%a in ('adb devices ^| findstr "device"') do (
    set /a i=i+1

    REM device is assigned to dynamic variable 
    for /f "tokens=1" %%b in ('echo device_!i!') do (
        set %%b=%%a
    )
)
echo !device_1!
echo !device_2!
endlocal
© www.soinside.com 2019 - 2024. All rights reserved.