Windows 批处理字符串redux中的双引号
我试图了解^Caret escape在批处理CMD中是如何工作的。假设我在CMD窗口中键入这一行,我希望它将目录列表发送到“c:\my text.txt” 相反,我得到了一个错误:Windows 批处理字符串redux中的双引号,windows,batch-file,cmd,escaping,Windows,Batch File,Cmd,Escaping,我试图了解^Caret escape在批处理CMD中是如何工作的。假设我在CMD窗口中键入这一行,我希望它将目录列表发送到“c:\my text.txt” 相反,我得到了一个错误: 'txt.txt" DIR *.*"' is not recognized as an internal or external command, operable program or batch file. 如果我做了这么简单的事情: ECHO "^"^"" Expected: """" Actual :
'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"
再次感谢。引号是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"
请注意,如果处理/F的,使用此技术可能会变得很棘手。。。在('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""
)
谢谢你的回复。我在上面添加了一个附加示例,因为注释允许有限的格式。我尝试使用你的建议,但仍然没有成功。@Neilw-我在回答中测试了代码,它们都起作用了(我忘了包括
setlocal enableDelayedExpansion
-编辑已经完成)。我还没有机会在你编辑的答案中使用更复杂的命令。@Neilw-好的,我想我对你更新的问题有一个解决方案。
(
cmd.exe /C ""sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name(^)" > "c:\temp\test 1.txt""
)