如何在解析类似命名的 XML 元素时为具有动态名称的环境变量赋值?
How to assign values to environment variables with dynamic name while parsing similar named XML elements?
我有一个 XML 文件,格式如下:
<pools>
<pool>aaa</pool>
<pool>bbb</pool>
<pool>ccc</pool>
<pool>ddd</pool>
<pool>eee</pool>
</pools>
我想以这样的方式解析这些标签,使它们分配给变量如
Pool1 = 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
注意: 定界符是两个尖括号,一个水平制表符和一个正常的 space 字符。请确保批处理文件完全包含 delims=
之后的那四个字符。
需要水平制表符和正常的 space 作为分隔符,以便在具有 pool
元素的行上获得独立于前导 spaces/tabs 的工作解决方案。
错误的标记分别是缺少分隔符 tab/space 导致在获取元素名称 pool
输出而不是 XML 元素 pool
的值时有问题的发布代码.
这种情况下不需要使用延迟环境变量扩展。
但是,使用call
强制对命令行进行二次解析
call set "Pool%%PoolCount%%=%%I"
在整个命令块的解析过程中已经修改为
call set "Pool%PoolCount%=%I"
在执行 set
之前比在下面的代码中使用 delayed expansion 更慢。
@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
原因由jeb in the DosTips forum post CALL me, or better avoid call解释。 Windows 命令处理器使用 call set "Pool%%PoolCount%%=%%I"
在当前目录的批处理文件中搜索,然后在环境变量 PATH
的所有目录中搜索匹配通配符模式 set.*
的文件。如果在其中一个目录中确实找到了类似 set.txt
的文件,它将在该目录中搜索下一个 set.COM
、set.EXE
、set.BAT
、set.CMD
、 ...根据环境变量 PATHEXT
的文件扩展名列表。如果 cmd.exe
在当前目录或 PATH
的另一个其他目录中确实找到文件名为 set
的可执行文件或脚本,文件扩展名为 PATHEXT
,它会执行executable/script 而不是 运行 内部命令 SET.
出于这个原因,使用延迟扩展解决方案肯定更好,因为它更快、更安全。
缺点是具有一个或多个 !
的 pool
值在启用延迟扩展的情况下无法正确处理。所以再一次 cmd.exe
证明了 Windows 命令处理器是为执行命令和可执行文件而设计的,而不是为处理文本文件中的数据而设计的。
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 用于在执行 set
. 之前双重解析命令行
echo /?
endlocal /?
findstr /?
for /?
rem /?
set /?
setlocal /?
阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul
的解释。重定向运算符 >
必须在 上用脱字符 ^
进行转义,以便在 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
。
我有一个 XML 文件,格式如下:
<pools>
<pool>aaa</pool>
<pool>bbb</pool>
<pool>ccc</pool>
<pool>ddd</pool>
<pool>eee</pool>
</pools>
我想以这样的方式解析这些标签,使它们分配给变量如
Pool1 = 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
注意: 定界符是两个尖括号,一个水平制表符和一个正常的 space 字符。请确保批处理文件完全包含 delims=
之后的那四个字符。
需要水平制表符和正常的 space 作为分隔符,以便在具有 pool
元素的行上获得独立于前导 spaces/tabs 的工作解决方案。
错误的标记分别是缺少分隔符 tab/space 导致在获取元素名称 pool
输出而不是 XML 元素 pool
的值时有问题的发布代码.
这种情况下不需要使用延迟环境变量扩展。
但是,使用call
强制对命令行进行二次解析
call set "Pool%%PoolCount%%=%%I"
在整个命令块的解析过程中已经修改为
call set "Pool%PoolCount%=%I"
在执行 set
之前比在下面的代码中使用 delayed expansion 更慢。
@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
原因由jeb in the DosTips forum post CALL me, or better avoid call解释。 Windows 命令处理器使用 call set "Pool%%PoolCount%%=%%I"
在当前目录的批处理文件中搜索,然后在环境变量 PATH
的所有目录中搜索匹配通配符模式 set.*
的文件。如果在其中一个目录中确实找到了类似 set.txt
的文件,它将在该目录中搜索下一个 set.COM
、set.EXE
、set.BAT
、set.CMD
、 ...根据环境变量 PATHEXT
的文件扩展名列表。如果 cmd.exe
在当前目录或 PATH
的另一个其他目录中确实找到文件名为 set
的可执行文件或脚本,文件扩展名为 PATHEXT
,它会执行executable/script 而不是 运行 内部命令 SET.
出于这个原因,使用延迟扩展解决方案肯定更好,因为它更快、更安全。
缺点是具有一个或多个 !
的 pool
值在启用延迟扩展的情况下无法正确处理。所以再一次 cmd.exe
证明了 Windows 命令处理器是为执行命令和可执行文件而设计的,而不是为处理文本文件中的数据而设计的。
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 用于在执行set
. 之前双重解析命令行
echo /?
endlocal /?
findstr /?
for /?
rem /?
set /?
setlocal /?
阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul
的解释。重定向运算符 >
必须在 上用脱字符 ^
进行转义,以便在 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
。