在解析相似的命名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 条评论
登录 后参与评论

相关文章

如何动态创建数组元素并将值(来自具有相同名称的变量)分配给元素

PHP-如果元素每条记录具有相似的标记,则获取正确的XML值

jQuery如何为变量分配名称(动态)

即使执行sudo su时,如何为所有用户设置环境变量?

当环境变量不存在时,如何分配默认的Ansible值?

如何为所有类型的OS设置环境变量?

仅当环境变量具有特定值时才设置Apache标头

Cython IPython Magic具有编译时环境变量

如何并行运行测试,要求环境变量具有不同的值

为什么 Python 无法检索环境变量的值,即使该变量在通过 bash 测试时具有值?

如何分配一系列名称相似的变量

Windows批处理:如何为变量分配动态名称?

当您具有“动态”值时如何解析json

如何为PHP设置环境变量?

如何为Java设置环境变量

如何为anacron设置环境变量?

当具有相似值的列具有相似的行值时合并两个不同的数据帧

在Spring中没有解析第一个环境变量时如何定义第二个环境变量?

如果它们具有相似的名称/值,则sql联接2个表

当DF在R中具有2个相似的列名称时,选择1列

使用相似的名称动态访问表单值

Jmeter - 如何为循环内的变量分配多个动态值

bash如何动态改变环境变量?

如何动态创建环境变量?

笑话:如何使用动态环境变量?

如何为变量分配元素?

具有环境变量的声纳特性

具有复杂符号的环境变量

如何联接两个查询中哪些表具有相似的名称?