Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理字符串redux中的双引号_Windows_Batch File_Cmd_Escaping - Fatal编程技术网

Windows 批处理字符串redux中的双引号

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 :

我试图了解^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  : "^"""
即使我尝试这样重复引用:

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""
)