如何在行继续符后正确转义带引号的命令?

3
运行以下示例批处理文件:
echo foo &&^
"C:\Program Files\Internet Explorer\iexplore.exe"

...产生以下输出:

foo
'"C:\Program' is not recognized as an internal or external command,
operable program or batch file.

我错过了什么?

编辑

如标记所示,这个问题涉及Windows(XP)批处理文件。

6个回答

7

很抱歉,几乎所有的答案都是错误的,或者不理解发生了什么。

这个问题与命令行或者是否在批处理文件中无关。

插入符号多行字符的规则如下:
在行末插入插入符号,会将下一行添加到当前行并转义附加行的第一个字符!
这就是你遇到问题的原因。

echo foo ^
&& echo bar
---- OUTPUT ---
foo &
bar
---------------

rem equivalent to
echo foo ^&& echo bar
rem So the first ampersand is escaped and the second works as a single &

这也是原始代码无法工作的原因。
echo foo &&^
"C:\Program Files\Internet Explorer\iexplore.exe"

rem is equivalent to this, so the quote will be escaped
echo foo &&^"C:\Program Files\Internet Explorer\iexplore.exe"

为什么另一种解决方案可行?

echo foo &&^
cmd /c "C:\Program Files\Internet Explorer\iexplore.exe"

rem is equivalent to
echo foo &&^cmd /c "C:\Program Files\Internet Explorer\iexplore.exe"

如果您正在避免使用 "c",这对于 "cmd" 并不重要。

有一种方法可以在不修改第二行的情况下使其正常工作。

echo foo && >con ^
"C:\Program Files\Internet Explorer\iexplore.exe"

这是一个特殊情况的特殊情况,插入符号在多行文本中起到正常作用,但不需要对第一个字符进行转义。(我猜测cmd.exe没有被编程来处理这个,它只是从混乱中出现了。)


2
谢谢您!我以为我疯了。另一个简单的解决方法是在插入符号后引用行的开头添加一个空格。 - matt wilkie

1

当引号前面有条件处理符号(即&&&||)时,cmd.exe似乎可以正确解析引号。

作为解决方法,您可以使用仅包含短名称且不带空格字符的路径:

echo foo &&^
C:\Progra~1\Intern~1\iexplore.exe

或者使用带有延迟变量扩展的辅助变量:

setlocal enabledelayedexpansion

set "IE_EXE=C:\Program Files\Internet Explorer\iexplore.exe"

echo foo &&^
!IE_EXE!

第二个解决方案向iexplore发送了错误的命令行。它将尝试打开“http://files/Internet%20Explorer/iexplore.exe”。 - wimh

1

这个似乎也可以工作:

echo foo &&^
cmd /c "C:\Program Files\Internet Explorer\iexplore.exe"

0
尝试将 && 放在第二行。
echo foo ^
&& "C:\Program files\internet explorer\iexplore.exe"

编辑:正如问题所述,此命令必须在批处理文件中运行。它可以从批处理文件中运行,但在命令行中运行时会出现错误!


这将显示 foo & 并且如果第一个命令失败,也会执行第二个命令。 - wimh
如果您按照 OP 指示将此命令放入批处理文件中,则该命令将正常工作。请尝试在批处理文件中运行该命令。 - bobs

-1

尝试移除这些&符号。

echo foo ^ 
"C:\Program Files\Internet Explorer\iexplore.exe"

我得到了

C:\Users\keith\Desktop>echo foo
foo

C:\Users\keith\Desktop>"C:\Program Files\Internet Explorer\iexplore.exe"

编辑 - 我的批处理文件顶部没有@echo off


如果您删除这些“&”符号,会改变命令的行为。这些符号表示第二个命令只有在第一个命令成功执行时才会运行。 - bobs
是的,我按照你之前建议的将&符号放在第二行,结果输出了'foo &'。 - kmfk
是的,如果您在cmd行中运行它,那就是真的。问题表明它应该在批处理文件中运行。在批处理文件中,它的工作方式不同。 - bobs
不,我的意思是我创建了这个批处理文件并从桌面运行它,然后收到了上面指示的回显。我目前正在运行Windows 7...可能是差异所在。 - kmfk

-1

如果路径中包含空格,您需要加引号;我不太确定您正在处理的是哪种语言,但基本上您需要:

""C:\Program Files\Internet Explorer\iexplore.exe""

Windows(XP)批处理文件。新错误: “”C:\ Program”未被识别为内部或外部命令,可执行程序或批处理文件。 - steamer25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接