我有一个 XML 文件,格式如下:
<pools>
<pool>aaa</pool>
<pool>bbb</pool>
<pool>ccc</pool>
<pool>ddd</pool>
<pool>eee</pool>
</pools>
我想以这样的方式解析这些标签,将它们分配给变量作为
池1=aaa
池2 = bbb
等等
我尝试过以下代码:
echo off
set /a x=0
SETLOCAL enableextensions enabledelayedexpansion
for /f "tokens=2 delims=<>" %%a in ('find /i "<pool>" ^< "pool_info.xml"') do (
set /a "x+=1"
call ECHO pool%%x%%=%%a
)
它只是正确打印它们。我尝试使用
set
命令来分配它们,但它不起作用。
我遇到了很多 Stack Overflow 问题,但无法找到任何符合我要求的解决方案。如果有人可以请帮助我。
PS:这里的
<pool>
标签计数是5,但是,计数可以改变,所以我希望它是灵活的。
任务可以通过以下方式完成:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Delete all environment variables of which name starts with Pool.
for /F "delims==" %%I in ('set Pool 2^>nul') do set "%%I="
set "PoolCount=0"
for /F "tokens=2 delims=<> " %%I in ('%SystemRoot%\System32\findstr.exe /I /L /C:"<pool>" "pool_info.xml"') do (
set /A PoolCount+=1
call set "Pool%%PoolCount%%=%%I"
)
rem Output all environment variables of which name starts with Pool.
set Pool
endlocal
注意: 分隔符是两个尖括号、一个水平制表符和一个普通空格字符。请确保批处理文件按顺序包含
delims=
之后的四个字符。
需要水平制表符和普通空格作为分隔符,以获得独立于具有
pool
元素的行上的前导空格/制表符的工作解决方案。
错误的标记以及缺少分隔符制表符/空格导致在获取元素名称
pool
输出而不是 XML 元素的值pool
时发布有问题的代码。
这种情况下不需要使用延迟环境变量扩展。
但是,使用
call
强制对命令行进行第二次解析
call set "Pool%%PoolCount%%=%%I"
在解析整个命令块期间已修改为
call set "Pool%PoolCount%=%I"
与使用下面代码中使用的延迟扩展
相比,在执行
set
之前速度较慢。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Delete all environment variables of which name starts with Pool.
for /F "delims==" %%I in ('set Pool 2^>nul') do set "%%I="
set "PoolCount=0"
for /F "tokens=2 delims=<> " %%I in ('%SystemRoot%\System32\findstr.exe /I /L /C:"<pool>" "pool_info.xml"') do (
set /A PoolCount+=1
set "Pool!PoolCount!=%%I"
)
rem Output all environment variables of which name starts with Pool.
set Pool
endlocal
DosTips 论坛帖子中的jeb解释了原因打电话给我,或者最好避免打电话。 Windows 命令处理器使用
call set "Pool%%PoolCount%%=%%I"
在当前目录的批处理文件中搜索,然后在环境变量 PATH
的所有目录中搜索与通配符模式 set.*
匹配的文件。如果在某个目录中确实找到了类似 set.txt
的文件,它会根据文件扩展名列表在该目录中搜索 set.COM
、set.EXE
、set.BAT
、set.CMD
...环境变量PATHEXT
。如果 cmd.exe
在当前目录或 set
的其他目录中确实找到文件名为 PATH
且文件扩展名为 PATHEXT
的可执行文件或脚本,则执行该可执行文件/脚本而不是运行内部命令设置。
因此,使用延迟扩展解决方案肯定更好,因为它更快、更安全。
缺点是具有一个或多个
pool
的 !
值在启用延迟扩展时无法正确处理。因此,cmd.exe
再次证明了 Windows 命令处理器是为执行命令和可执行文件而设计的,而不是为处理文本文件中的数据而设计的。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
...用于在执行set
之前双重解析命令行。echo /?
endlocal /?
findstr /?
for /?
rem /?
set /?
setlocal /?
阅读有关 使用命令重定向运算符的 Microsoft 文档,了解
2>nul
的说明。重定向运算符 >
必须在 FOR命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的 set
命令行)之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程,并使用 %ComSpec% /c
和 '
中的命令行作为附加参数附加。
...
set /a "x+=1"
call SET pool%%x%%=%%a
)
SET pool
第一个
set
将%%a
中的值赋给变量pool?
第二个
set
显示当前设置的所有名称以pool
开头的环境变量。
setx
是一个命令,旨在记录未来 cmd
实例的变量赋值。这是一个完全不同的问题,应该作为一个单独的问题提出,但是有很多关于 setx
的 SO 项目,所以(再次)作为一个单独的问题提出它可能会作为重复项被关闭。最好使用 search
设施来 setx
。