使用批处理脚本进行字符串解析

String parsing with batch scripting

我有一个名为 pictures.xml 的文件,其中包含一些图片信息,例如:

<ResourcePicture Name="a.jpg">
        <GeneratedPicture Name="b.jpg"/>            
        <GeneratedPicture Name="c.jpg"/>
</ResourcePicture>

<ResourcePicture Name="z1.jpg">
        <GeneratedPicture Name="z2.jpg"/>
        <GeneratedPicture Name="z3.jpg"/>
        <GeneratedPicture Name="z4.jpg"/>
</ResourcePicture>

我想做的是在 for 循环中获取 每一行 并打印 图片名称 。示例输出如:

  1. a.jpg - b.jpg c.jpg
  2. z1.jpg - z2.jpg z3.jpg z4.jpg

我可以获取每一行但无法获取 name 属性

    for /f "Delims=/" %%a in (pictures.xml) do ( 
        echo %%a
    )

这应该有效:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=*" %%a in (pictures.xml) DO (
    SET b=%%a
    SET b=!b:"=+!
    FOR /F "delims=+ tokens=2" %%c in ("!b!") DO (
        ECHO %%c
    )
)

这将只输出 something.jpg。这里解释: 首先,我们将文件分成几行。现在我们想在每一行中找到 something.jpg 并只输出这些标记。所以我们可以用 " 作为分隔符拆分行并取第二个子字符串。但是我们不能使用 " 作为 delim 因为 CMD 不会接受这个。这就是我们首先将 " 替换为 + 的原因。如果 + 可以出现在您的代码中,请使用其他被接受为分隔符但不会出现在您的 xml 文件中的字符。

最后,我们现在可以使用 + 作为分隔符拆分每一行,并取每行的第二个子字符串,这将只生成文件名。

编辑:以下是检查行是否以 "ResourcePicture":

开头的方法
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=*" %%a in (pictures.xml) do (
    SET b=%%a
    SET prefix=!b:~1,15!
    IF !prefix!==ResourcePicture (
        SET b=!b:"=+!
        FOR /F "delims=+ tokens=2" %%c in ("!b!") DO (
            ECHO %%c
        )
    )
)