在解析相似的命名XML元素时,如何为具有动态名称的环境变量分配值?

潘卡伊

我有以下方式的XML文件:

<pools>
    <pool>aaa</pool>
    <pool>bbb</pool>
    <pool>ccc</pool>
    <pool>ddd</pool>
    <pool>eee</pool>
</pools>

我想分析这样这些标签,他们将被分配到变量作为

Pool1 = aaa
Pool2 = 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分配它们命令,但是它不起作用。

我遇到了许多堆栈溢出问题,但是找不到符合我要求的解决方案。如果有人可以帮助我。

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

jeb在DosTips论坛帖子CALL me中解释了原因,或者最好避免致电Windows命令处理器call set "Pool%%PoolCount%%=%%I"在环境变量的当前目录中的下一个批处理文件中使用,然后在环境变量的所有目录中的下一个中搜索,以查找与PATH通配符模式匹配的文件set.*如果发现确实像一个文件set.txt在目录中,它会搜索该目录中接下来set.COMset.EXEset.BATset.CMD,...根据环境变量的文件扩展名列表PATHEXT如果确实在当前目录中找到了cmd.exe带有文件名的可执行文件或脚本,set或者在另一个其他目录中找到PATH了扩展名为的可执行文件或脚本PATHEXT,它将执行可执行文件/脚本,而不是运行内部命令SET

因此,最好使用延迟扩展解决方案,因为它更快,更安全。

缺点是pool具有一个或多个值的值!在启用延迟扩展后无法正确处理。因此,再次cmd.exe证明了Windows命令处理器是为执行命令和可执行文件而设计的,而不是为处理文本文件中的数据而设计的。

为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • call /?...用于在执行之前对命令行进行双重解析set
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • rem /?
  • set /?
  • setlocal /?

阅读有关使用命令重定向运算符的Microsoft文档,获取有关的说明2>nulWindows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,>必须^FOR命令行使用脱字符号将重定向运算符转义为文字字符,该命令在后台以和命令行启动的单独命令进程中执行嵌入式命令行内作为附加参数。set%ComSpec% /c'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章