如何在Windows批处理文件中正确转义括号?

dem*_*7up 3 windows batch-file

我正在尝试在Windows批处理文件中使用这些命令行:

SET mypath="%programfiles(x86)%\Directory\SubDirectory"
SET app2="com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi^,armeabi-v7a^,x86)(nodpi)_apkmirror.com.apk"

If Not Exist "%mypath%\includes\apk\%app2%" (
  Rem DO SOMETHING
) ELSE (
  Rem DO SOMETHING ELSE
)
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

(nodpi)_apkmirror.com.apk was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

执行批处理文件时出现此错误消息的原因是什么?

Mof*_*ofi 6

在命令行上使用'set var = text'后,阅读我的答案为什么没有字符串输出'echo%var%'?你应该明白为什么这样做:

SET "app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk"
Run Code Online (Sandbox Code Playgroud)

注意:第一个双引号留给变量名.

命令为SET,参数为:

app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk
Run Code Online (Sandbox Code Playgroud)

需要用双引号括起来获取空格,这些字符被&()[]{}^=;!'+,`~<|>解释为文字字符.

不要忘记app2在使用%app2%或启用延迟扩展和引用变量app2时引用用双引号括起来的环境变量!app2!.

app2如果与其他字符串连接,则包含对环境变量的引用的整个参数字符串通常必须用双引号括起来.另请参见如何使用空格设置环境变量?某些应用程序(如Windows资源管理器)需要在参数字符串中引用文件/文件夹名称,而不是整个参数字符串.命令ECHO也是参数字符串的一个例外,它从以下标准解析:

Command "argument 1" argument2 "argument 3 with ( and ) in string"
"Path to executable\program.exe" "argument 1" argument2 "argument 3 with ( and ) in string"
Run Code Online (Sandbox Code Playgroud)

例:

@echo off
set "mypath=%TEMP%"
set "app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk"
if not exist "%mypath%\includes\apk\%app2%" echo File %mypath%\includes\apk\%app2% does not exist!
pause
Run Code Online (Sandbox Code Playgroud)

IF命令有4个参数字符串.

  1. 参数0是IF命令本身.
  2. 论证1是not.
  3. 论据2是exist.
  4. 参数3是具有完整路径的文件名,%mypath%\includes\apk\%app2%由于包含空格和其中一个字符,因此必须用双引号括起来&()[]{}^=;!'+,`~.

好吧,字符串%mypath%\includes\apk\%app2%不包含空格或括号.但是在调试批处理文件时可以看到Windows命令解释程序执行命令IF 之前在整个IF命令行的预处理期间扩展环境变量.因此IF命令处理完整路径的文件名包含括号.

请注意,在文本编辑器中打开批处理文件包含的内容无关紧要.在执行命令行之前,命令行或(以匹配开头并以匹配结束的整个命令块如何在)Windows命令解释器预处理之后始终很重要.

当一个文件或文件夹名称必须用双引号括起来时,Windows命令解释cmd.exe程序在运行时cmd /?解释批处理文件输出的帮助在最后一个输出帮助页面的最后一段中说明.包含<|>应被解释为文字字符的重定向运算符的参数字符串也必须用双引号括起来.文件/文件夹名称不能包含<|>.

批处理文件中的命令行发布的问题正确编码:

@echo off
set "mypath=%ProgramFiles(x86)%\MEKNYC\FireMax_Wizard"
set "app2=com.estrongs.android.pop_4.1.6.8.9.3-604_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)_apkmirror.com.apk"

if not exist "%mypath%\includes\apk\%app2%" (
  echo File "%mypath%\includes\apk\%app2%" does not exist.
  rem Other commands on missing file.
) else (
  echo File "%mypath%\includes\apk\%app2%" exists.
  rem Other commands on existing file.
)
Run Code Online (Sandbox Code Playgroud)

在两个ECHO命令行中,带有完整路径的文件名用双引号括起来,这在前面的示例中没有完成.其原因是,%mypath%%app2%在两个被替换ECHO预处理整个命令块开始时由这两个环境变量的字符串值命令行(IF命令行和结束于)该命令之前最后一个命令行上IF是在所有执行.因此,首次出现的)文件名不包含在双引号中,Windows命令解释器将其解释为真实条件的命令块结束,并且结果是错误消息.前面的示例包含一个IF条件,只有命令ECHO才能在没有命令块的情况下执行(,因此可以安全地输出整个文件名而不用双引号将其括起来.但是,我强烈建议将没有/带路径的文件/文件夹名称通过ECHO输出到控制台窗口(未重定向到文件中),因为文件/文件夹字符串也可能包含一个&符号&,这会导致找到问题在双引号参数字符串之外的命令行上.