是否可以在不向输出添加引号的情况下回显包含 FOR/IF 语句中带空格的路径的字符串?

Is it possible to echo a string including path with spaces within FOR/IF statement without adding quotes to the output?

如果你执行这个:

if "true" == "true" (
    echo Path is C:\Program Files (x86)\MyFolder
)

你会得到一个错误:

\MyFolder was unexpected at this time.

如果将路径作为变量传递给 echo,这也是一样的。

有一个解决方案。这可以通过用双引号(或只是路径本身)将 echo 的文本括起来来解决。

然而,这会在输出文本中添加双引号:

Path is "C:\Program Files (x86)\MyFolder"

有没有办法在不改变输出的情况下处理这种情况?

正如 @compo 的评论中所述,右括号导致了问题,因为系统认为它是您之前左括号的右括号。因此,您需要转义括号 ^)

但是 正如您所说,当您的输出结果未知时,这对您没有帮助,但是我确实理解为什么引用的路径在输出中有问题。但无论如何,因此您需要解决这个问题,这里有一些方法,具体取决于您的实际脚本布局。

第一个选项,不要使用带括号的 if 代码块:

if "true" == "true" echo path is %ProgramFiles(x86)%\MyFolder

然而,上述方法不允许您执行其他语句,您需要多个 if 语句。

另一个更好的选择是在匹配时简单地设置变量。根据您的代码块,这些可能需要 delayedexpansion

if "true" == "true" (
     set "mypath=%ProgramFiles(x86)%\MyPath"
   ) else (
     set "mypath=%ProgramFiles(x86)%\AnotherPath"
 )
echo %mypath%

要回显包含特殊字符的任意文本,您可以将文本分配给一个变量,然后在回显时应用 delayed variable expansion

set "EchoPath=C:\Program Files (x86)\MyFolder"
setlocal EnableDelayedExpansion
if "true" == "true" (
    echo(!EchoPath!
)
endlocal

setlocalcommand enables delayed expansion here, the exclamation marks around the variable actually use it. The endlocal command结束延迟扩容。请注意,自 setlocal 以来对变量 EchoPath 的任何更改都会在 endlocal.

之后丢失

这里使用看起来很奇怪的语法 echo( 来避免某些字符串如 onoff(它们是特殊关键字)或 [=19 这样的字符串出现问题=],所有这些理论上都可以存储在变量中。另请参阅以下主题:

  • Echo a blank (empty) line to the console from a Windows batch file
  • How can I echo a newline in a batch file?