【问题标题】:How to locate a specific string of letters in a .BAT variable that contains a very long string?如何在包含很长字符串的 .BAT 变量中找到特定的字母字符串?
【发布时间】:2020-03-27 14:53:43
【问题描述】:

试图仅隔离 .BAT 变量中包含的字符串的一部分。

字符串变量 !Original! 包含以下内容:

v2.30|Action=Allow|Active=FALSE|Dir=In|Profile=Domain|Profile=Private|Name=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/PackageDisplayName}|Desc=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/ProductDescription}|LUOwn=S-1-5-21-1502285707-838241421-2811185785-1001|AppPkgId=S-1-15-2-1861897761-1695161497-2927542615-642690995-327840285-2659745135-2630312742|EmbedCtxt=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/PackageDisplayName}|Platform=2:6:2|Platform2=GTEQ|

我正在尝试将其解析为单词“Name=”之后的字符序列。

以下 For 循环返回:系统找不到文件 v2.30|Action。

FOR /F "tokens=* delims=" %%h in (!Original! ^| Findstr "Name=") do (ECHO %%h)

我做错了什么?为什么它只读取 !Original! 的前一小部分内容?

赞赏...

【问题讨论】:

    标签: batch-file cmd find delayedvariableexpansion


    【解决方案1】:

    试试这个(另存为.bat):

    @if (@X)==(@Y) @end /* JScript comment
        @echo off
    
        set "string=v2.30|Action=Allow|Active=FALSE|Dir=In|Profile=Domain|Profile=Private|Name=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/PackageDisplayName}|Desc=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/ProductDescription}|LUOwn=S-1-5-21-1502285707-838241421-2811185785-1001|AppPkgId=S-1-15-2-1861897761-1695161497-2927542615-642690995-327840285-2659745135-2630312742|EmbedCtxt=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/PackageDisplayName}|Platform=2:6:2|Platform2=GTEQ|"
        set "splitBy=|"
    
        for /f "tokens=* delims=" %%a in ('cscript //E:JScript //nologo "%~f0"  "%string%" "%splitBy%"') do (
            set "%%~a" 2>nul
        )
        echo %Name%
        exit /b %errorlevel%
    
    @if (@X)==(@Y) @end JScript comment */
    
    var string=WScript.Arguments.Item(0);
    var splitBy=WScript.Arguments.Item(1);
    
    var i;
    for (i = 0; i < string.split(splitBy).length; i++) {
      WScript.Echo(string.split(splitBy)[i]);
    }
    

    仅批处理语法解决方案:

    @echo off
    setlocal EnableDelayedExpansion
    
    @echo off
    REM Creating a Newline variable (the two blank lines are required!)
    set NLM=^
    
    
    set NL=^^^%NLM%%NLM%^%NLM%%NLM%
    
    
    set "string=v2.30|Action=Allow|Active=FALSE|Dir=In|Profile=Domain|Profile=Private|Name=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/PackageDisplayName}|Desc=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/ProductDescription}|LUOwn=S-1-5-21-1502285707-838241421-2811185785-1001|AppPkgId=S-1-15-2-1861897761-1695161497-2927542615-642690995-327840285-2659745135-2630312742|EmbedCtxt=@{Microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy?ms-resource://Microsoft.Windows.Cortana/resources/PackageDisplayName}|Platform=2:6:2|Platform2=GTEQ|"
    
    setlocal enableDelayedExpansion
    echo !string:^|=%NL%! >#
    for /f "tokens=* delims=" %%a in (#) do (
        set "%%~a" >nul 2>&1
    )
    
    echo %NAME%
    del /q #
    

    【讨论】:

    • 这可能行得通。但是,试图仅将其保留为 .bat 代码。
    • @Arianax - 检查我的更新。第一种方法无需创建临时文件即可工作。使用仅批处理的解决方案,您将需要一个。
    • 没有临时文件:更改为 set NL=^%NLM%%NLM%^%NLM%%NLM%for /f "tokens=* delims=" %%a in ("%string:|=!NL!%") do set "%%~a" 2&gt;nul(至少使用该字符串;当字符串包含 %&amp;&lt;&gt;"! 时可能会有所不同 - 未测试)
    • @Stephan - 我试过这个,但是当字符串有?时它不起作用。 NAME 有它。普通的FOR 用于迭代文件,? 始终用作通配符 - 无法关闭此功能。
    • 似乎对我有用(尽管您对? 的正确说法可能是因为引号将for /f 强制为“字符串模式”)。我明天再检查一遍——现在脑杂技已经太晚了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多