批量字符串redux中的双引号

时间:2014-01-27 16:24:45

标签: windows batch-file cmd escaping

我正在尝试理解^ Caret如何在Batch CMD中工作。假设我在CMD窗口中键入此行,我希望它将DIR列表发送到“c:\ my text.txt”

CMD.EXE "/C > ^"c:\my text.txt^" DIR C:\*.*"

相反,我得到了错误:

'txt.txt" DIR *.*"' is not recognized as an internal or external command, 
operable program or batch file.

如果我做的事情很简单:

ECHO "^"^""

Expected: """"
Actual  : "^"""

即使我像这样尝试双引号:

ECHO " "" "" "

Expected: " " " "
Actual  : " "" "" "

有人可以说它是如何工作的,可靠的方法是在命令行中转义双引号吗?

感谢。

附加示例:

为什么这样做:

cmd.exe "/C sqlcmd.exe -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt""

但是这会出错“系统无法找到指定的路径。”并且不会创建txt文件。

cmd.exe "/C "sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt""

我知道在这种情况下不需要它,但是如何将命令sqlcmd.exe括在引号中?

我也尝试用相同的结果删除整行的引号,即

cmd.exe /C "sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt"

再次感谢。

1 个答案:

答案 0 :(得分:2)

引号是cmd.exe中的状态机。第一个引用引用语义,下一个引用将其关闭,下一个引用等等。

可以转义引号,使其不会引用引号语义。

例如,以下内容将向test.txt发送引号字符

echo ^" >test.txt

没有转义,字符串" >test.txt就会被打印到屏幕上。

不幸的是, 不可能 来逃避拒绝引用语义的引用。

例如,假设您要将字符串"hello world" >"test.txt"打印到屏幕上。您尝试的技术都不起作用,因为内部报价无法转义。 ^"表单将^视为文字,输出仍会重定向到文件。 ""正确引用>,因此没有重定向,但现在您有两个引号而不是一个。

您有两种选择。

1)转义未引用的所有“毒药”字符

echo "hello world" ^>"test.txt"

2)在延迟扩展变量

中隐藏引用文字

我假设此代码在批处理脚本中。

setlocal enableDelayedExpansion
set "quote=""
echo "hello world!quote! >!quote!test.txt"

请注意,如果处理FOR /F ... IN('command')CMD /C,使用此技术会变得棘手,因为延迟扩展可能会在新的CMD.EXE上下文中关闭。


这是一种执行原始命令的方法

cmd /c dir c:\*.* ^>"c:\my text.txt"

请注意,/c之后的整个命令字符串不必括在引号内。在这种情况下,如果不是这样更容易。


我相信你最后的新命令可以写成如下:

cmd.exe /C ""sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt""

如果在带括号的块中使用,则需要转义右边的paren。

(
  cmd.exe /C ""sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name(^)" > "c:\temp\test 1.txt""
)