批处理脚本中的字符串解析

3
我有一个名为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
    )
1个回答

1
这应该可以工作:

@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 并仅输出这些标记。因此,我们可以使用 " 作为分隔符拆分行,并取第二个子字符串。但是,我们不能使用 " 作为分隔符,因为 CMD 不接受此字符。这就是为什么我们首先用 +" 替换。如果 + 可以出现在您的代码中,请使用另一个被接受为分隔符但不会出现在 xml 文件中的字符。
最后,我们现在可以使用 + 作为分隔符拆分每一行,并获取每行的第2个子字符串,这将导致仅获得文件名。
编辑:如何检查您的行是否以“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
        )
    )
)

有没有一种方法可以使用简单的if语句来确定当前行是否包含ResourcePicture? - ozcanovunc
“包含”并不简单,但您可以检查它是否以“<ResourcePicture”开头。我会在我的答案中添加代码。 - MichaelS
完成。关键是 SET prefix=!b:~1,15!。这将跳过字符串的第一个字符,并从第二个索引开始取15个字符,因此 "<ResourcePicture Name="a.jpg">" 变成了 "ResourcePicture"。 - MichaelS
你是专家!再次非常感谢。 - ozcanovunc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接