gpt4 book ai didi

windows - 批处理文件在 FOR 循环中处理带有特殊字符和引号的字符串

转载 作者:可可西里 更新时间:2023-11-01 11:16:18 24 4
gpt4 key购买 nike

下面的代码片段去除了所有多余的垃圾,只剩下产生错误的代码,

)"" was unexpected at this time.

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
Set "regex="(Test_Health=(?!100))""
echo Regex is: %regex%

FOR /L %%I IN (1,1,5) DO (
Set "to_call=call crv.exe "%%I" %regex%"
echo About to call: !to_call!
)

基本上,在实际脚本中,我试图调用一个命令行工具,该工具接受一个复杂的字符串,其中可能包含特殊字符,以及一个正则表达式。

我想出了一个解决方法,即在 %%I 的最后一个引号之前添加一个插入符号 (^):

Set "to_call=call crv.exe "%%I^" %regex%"

但这感觉像是一个肮脏的 hack。我做错了什么,我应该怎么做才能在没有肮脏的黑客攻击的情况下获得所需的行为?

最佳答案

无需破解即可解决您的问题:

  • 确保 !字符。在你的regex变量值被识别为文字:

    • Set "regex=(Test_Health=(?^!100))"

    • 由于 setlocal enabledelayedexpansion , 文字 !字符。里面"..."必须转义为 ^! .

    • 请注意 <name>=<value> token 被双引号作为一个整体,以防止对值进行额外的解释。

  • 引用变量regex 延迟 for循环体:

    • 使用 !regex!而不是 %regex% .

    • 为了使生成的命令行更加健壮 - 即使在这种特定情况下不需要它 - 确保 regex 的值用双引号括起来(注意 %%I - 作为一个单纯的数字 - 不需要需要引号):
      Set "to_call=call crv.exe %%I "!regex!""

综合起来:

@echo off
setlocal enabledelayedexpansion enableextensions

Set "regex=(Test_Health=(?^!100))"
echo Regex is: %regex%

FOR /L %%I IN (1,1,5) DO (
Set "to_call=call crv.exe %%I "!regex!""
echo About to call: !to_call!
)

产量:

Regex is: (Test_Health=(?100))
call crv.exe 1 "(Test_Health=(?!100))"
call crv.exe 2 "(Test_Health=(?!100))"
call crv.exe 3 "(Test_Health=(?!100))"
call crv.exe 4 "(Test_Health=(?!100))"
call crv.exe 5 "(Test_Health=(?!100))"

至于你做错了什么:

%<name>% - 样式变量引用 - 除了 loop 变量(在本例中为 %%I) - 在循环被解析之前在循环体内((...))展开,因此此类变量引用的可以打破循环。

这是一个演示问题的最小示例:

@echo off
Set "regex=))"

FOR %%I IN ("dummy") DO (
rem !! breaks, because the up-front %regex% expansion causes a syntax error.
echo %regex%
)

延迟扩展 - 通过将变量名包含在 !...! 中,假设 setlocal enabledelayedexpansion有效 - 绕过这个问题:

@echo off
setlocal enabledelayedexpansion
Set "regex=))"

FOR %%I IN ("dummy") DO (
rem OK - outputs "))"
echo !regex!
)

关于windows - 批处理文件在 FOR 循环中处理带有特殊字符和引号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42264275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com