在批处理脚本中从XML提取GUID



我有一个字符串

<?define customGUID=             "DA7C36F0-A749-4CC5-9575-398C06039325"?>

我正试图把DA7C36F0-A749-4CC5-9575-398C06039325从这条线上删掉。

首先,我试图在一个变量中设置这个字符串,但我无法做到这一点,可能是因为字符串中的<?,我尝试了:

set "var=<?define customGUID=            "DA7C36F0-A749-4CC5-9575-398C06039325"?>"

但后来我能够在运行时以某种方式获取字符串,现在我有了变量

line=<?define customGUID=            "DA7C36F0-A749-4CC5-9575-398C06039325"?>

我不知道如何使用批处理脚本从该变量中仅修剪值,即DA7C36F0-A749-4CC5-9575-398C06039325。

我试着至少用来修剪后缀

set "line=%line:"?>%"

但是,如果出现错误,有人能帮助我们找到更好的方法吗?注:空格包含在字符串中

您可以使用"作为分隔符来分割字符串,但由于引号用于指定for循环选项,因此语法看起来与通常略有不同:

@echo off
setlocal enabledelayedexpansion
set "line=<?define customGUID=            "DA7C36F0-A749-4CC5-9575-398C06039325"?>"
echo !line!
for /f tokens^=2^ delims^=^" %%A in ("!line!") do set "line=%%A"
echo !line!

您可以使用这个非常简单的技巧:

@echo off
setlocal EnableDelayedExpansion
set "var=<?define customGUID=            "DA7C36F0-A749-4CC5-9575-398C06039325"?>"
set "i=0" & set "v0=%var:"=" & set /A i+=1 & set "v!i!=%"
echo Desired string: [%v1%]

如果你想知道这是如何工作的,请删除@echo off行并仔细查看屏幕上显示的内容。。。

您的命令行:

set "line=%line:"?>%"

没有意义,因为缺少=符号(指子字符串替换(:

set "line=%line:"?>=%"

为了去掉不需要的前缀,你可以删除第一个引号之前的所有内容:

set "line=%line:*"=%"

然而,只有在删除后缀后这样做时,这才有效,因为您要处理的是不平衡的引号,这与立即变量展开一起是有问题的。如果你想更改顺序,你必须实现转义,以免显示重定向运算符>(未引用(:

set ^"line=%line:*"=%"
set "line=%line:"?>=%"

为了避免根据输入字符串进行转义,请使用延迟变量展开,如下所示:

set "line=<?define customGUID=            "DA7C36F0-A749-4CC5-9575-398C06039325"?>"
set line
rem // First enable delayed expansion:
setlocal EnableDelayedExpansion
rem // Then apply it by replacing `%` with `!`:
set "line=!line:*"=!"
set "line=!line:"?>=!"
set line
rem // This restores the previous state:
endlocal
rem // At this point changes in the variable are no longer available due to localisation:
set line

相关内容

  • 没有找到相关文章

最新更新