我正在尝试理解^ 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"
再次感谢。
答案 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""
)