【问题标题】:Extract a GUID from XML in batch script在批处理脚本中从 XML 中提取 GUID
【发布时间】:2022-10-17 17:09:23
【问题描述】:

我有一个字符串

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

我正在尝试从这条线上删除DA7C36F0-A749-4CC5-9575-398C06039325

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

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:"?>%"

但是遇到错误,任何人都可以提供更好的方法吗? 注意:空格包含在字符串中

【问题讨论】:

  • 要直接从文件 myFile.xml 中获取您的 GUID,并将其保存为名为 strGUID 的变量的字符串值,您可以这样做:@For /F Tokens^=2^ Delims^=^" %%G In ('%SystemRoot%\System32\find.exe /I " customGUID=" 0^&lt;"myFile.xml" 2^&gt;NUL') Do @Set "strGUID=%%G"。最好在该行之前加上@Set "strGUID=" 以确保不存在具有该名称的现有变量,然后您可以使用IfDefined strGUID 添加第三行以确定该行是否在命名文件,然后再继续执行其余代码。

标签: batch-file


【解决方案1】:

您可以使用" 作为分隔符来拆分字符串,但由于使用引号指定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!

【讨论】:

    【解决方案2】:

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

    @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 行并仔细查看屏幕上显示的内容...

    【讨论】:

      【解决方案3】:

      你的命令行:

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

      没有意义,因为缺少=-sign(参考sub-string substitution):

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

      要删除不需要的前缀,您可以删除第一个引号之前的所有内容:

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

      但是,这仅在删除后缀后才有效,因为您正在处理不平衡的引号,这与立即变量扩展一起存在问题。如果要更改顺序,则必须执行 escaping 以不显示未引用的 redirection operator &gt;

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

      为避免根据输入字符串进行转义,请使用delayed variable expansion,如下所示:

      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
      

      【讨论】:

        猜你喜欢
        • 2018-05-17
        • 1970-01-01
        • 2011-06-15
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多