Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理字符转义_Windows_Batch File_Cmd_Scripting_Escaping - Fatal编程技术网

Windows 批处理字符转义

Windows 批处理字符转义,windows,batch-file,cmd,scripting,escaping,Windows,Batch File,Cmd,Scripting,Escaping,我在为Windows编写批处理脚本方面相当熟练,但即使在这么多年之后,如何正确地转义字符仍然困扰着我。当试图找出正确的方法来转义用于sed的正则表达式时,这尤其困难。有什么工具可以帮我吗?也许有什么东西可以让我粘贴到一个“普通”字符串中,然后它会吐出该字符串的正确转义版本 更新:我不愿意给出一个例子,因为我不是在寻找如何转义一个特定字符串的答案。我也不寻找一个解决方案,将工作的一个特定的应用程序。我正在寻找一种工具,它可以帮助我为需要转义的每个字符串获得正确的转义语法,而不管是什么工具从命令行使

我在为Windows编写批处理脚本方面相当熟练,但即使在这么多年之后,如何正确地转义字符仍然困扰着我。当试图找出正确的方法来转义用于sed的正则表达式时,这尤其困难。有什么工具可以帮我吗?也许有什么东西可以让我粘贴到一个“普通”字符串中,然后它会吐出该字符串的正确转义版本

更新:我不愿意给出一个例子,因为我不是在寻找如何转义一个特定字符串的答案。我也不寻找一个解决方案,将工作的一个特定的应用程序。我正在寻找一种工具,它可以帮助我为需要转义的每个字符串获得正确的转义语法,而不管是什么工具从命令行使用它

也就是说我真正想要的正则表达式是

(^.*)(Form Product=")([^"]*") FormType="[^"]*" FormID="([0-9][0-9]*)".*$
取那个真正的正则表达式(即,就批处理而言,是unscaped)并用一些sed语法将它包装起来,比如
ssed“s@--Insert escaped regex here--@http://psph/\1/\2@g“%$1”
并最终将其转义。。。同样,是否有任何工具可以帮助转义任何字符串以在批处理命令行上使用


p、 BATCH的转义语法有太多的例外情况,我甚至愿意接受一份好的备忘单。

您可以简单地使用一个外部文件作为sed的输入

或者直接在批处理中使用字符串,最好使用延迟扩展

setlocal DisableDelayedExpansion
set "regEx=s/^#*$/""/g"
setlocal EnableDelayedExpansion
sed !regEx! file.txt
编辑:如何在批处理中使用未修改的字符串

这将使用findstr直接从批处理中获取字符串,并将其返回到结果变量中。
因此,您可以按原样使用sed字符串

@echo off
setlocal
REM SedString1#(^.*)(Form Product=")([^"]*") FormType="[^"]*" FormID="([0-9][0-9]*)".*$

call :GetSEDString result SedString1
setLocal EnableDelayedExpansion
echo the sedString is !result!
sed !result!
goto :eof

:GetSEDString <resultVar> <searchName>
:: Search the own batch file for <searchName> in a line with "REM <searchName>#"
:: Return all after the "#" without any modification
setLocal DisableDelayedExpansion
for /f "usebackq tokens=* delims=" %%G in (`findstr /n /c:"REM %~2#" "%~f0"`) do (
    set "str=%%G"
)
setLocal EnableDelayedExpansion
set "str=!str:*#=!"

for /F "delims=" %%A in ("!str!") DO (
  endlocal
  endlocal
  set "%~1=%%A"
  goto :eof
)

goto :eof
@echo关闭
setlocal
REM SedString1#(^.*)(Form Product=“)([^”]*”)FormType=“[^”]*”FormID=“([0-9][0-9]*)”*$
调用:GetSEDString结果SedString1
setLocal EnableDelayedExpansion
回音字符串是!结果!
塞德!结果!
后藤:eof
:GetSEDString
::使用“REM#”在自己的批处理文件中搜索
::返回“#”后面的所有字符,不做任何修改
setLocal DisableDelayedExpansion
对于/f“usebackq tokens=*delims=“%%G in(`findstr/n/c:“%REM%~2#”“%~f0”`)do(
设置“str=%%G”
)
setLocal EnableDelayedExpansion
设置“str=!str:**=!”
对于/F“delims=“%%A in(“!str!”)DO(
端部
端部
设置“%~1=%%A”
后藤:eof
)
后藤:eof

批处理的转义字符是插入符号(
^
)。如果要在脚本中包含任何管道字符,则需要在字符前面加上插入符号:

:: Won't work:
@echo Syntax: MyCommand > [file]

:: Will work:
@echo Syntax: MyCommand ^> [file]

经作者许可,可从上页进行改编

太长,读不下去了 :

就像宇宙一样,如果有人真的完全理解了Batch,那么该语言将立即被其自身的无限怪异和更复杂的版本所取代。显然,这种情况以前至少发生过一次;)

百分号
%
%%
可以转义为
%%
–“在双引号字符串中可能并不总是需要[转义],请尝试”

通常,使用插入符号
^
这些字符“在双引号字符串中可能并不总是需要[转义],但这不会造成伤害”:

  • ^
  • &
  • |
示例:
echo a^>b
在屏幕上打印
a>b

仅在/F“主题”(即括号之间)的
中需要[转义],除非使用了
backq

`
仅在/F
“主题”(即括号之间)的
中需要[转义],如果使用了
backq

这些字符“仅在
FOR/F
“subject”(即括号之间)中需要[转义],甚至在双引号字符串中需要转义”:

  • =
使用延迟变量展开时使用双转义感叹号
必须转义
^^当延迟变量扩展激活时

find
搜索模式中使用双引号
→ <代码>“”

findstr
Regex模式中使用反斜杠
  • \
  • [
  • ]
  • *
阿尔索 Rob对这个问题作了进一步评论(通过与我本人的电子邮件通信):

至于答案,恐怕混乱情况比最初的海报所意识到的还要糟糕:转义括号的要求也取决于字符串是否在代码块中

我猜一个自动工具可以在每个字符前插入插入插入符号,然后将所有百分号加倍-如果字符串被双引号引用,它仍然会失败


此外,各个程序负责解析它们的命令行参数,因此需要一些转义,例如对于
sed
sed
,可能是由于批处理脚本中调用的特定程序。

保留所有命令行参数的简单解决方案是使用
%*
:它返回从第一个命令行参数开始的整个命令行(在Windows NT 4中,
%*
还包括所有前导空格)并排除任何输出重定向。

请添加一个要转义的示例字符串!清楚地了解你真正想要的@PauleR我已经在DOS等编写批次脚本,自从1986(和汇编,C,C++等),然后移动到UNIX,现在我被迫返回一个时刻。OP提出的问题不是矛盾修饰法;下面的答案就是证明。批处理始终是一门黑暗的艺术。要真正理解批处理转义,您必须吸收并理解阶段1、2、4、5、5.3,