另一种转义引号的方法(虽然可能不是最好的),我发现在某些地方使用的是使用多个双引号。为了使其他人的代码易读,我将进行解释。 这里有一组基本规则: 1.如果未包含在双引号组中,请用空格分隔参数: program param1 param2 param 3将向program.exe传递四个参数: param1、param2、param和3。 1.双引号组在向程序传递参数时忽略空格作为值分隔符: program one two "three and more"将向program.exe传递三个参数: one、two和three and more。* 现在解释一些混淆:* 1.直接与未使用双引号换行的文本相邻的双引号组连接到一个参数中: hello"to the entire"world作为一个参数:helloto the entireworld.* 注:前面的规则并不意味着两个双引号的组可以直接相邻出现。 1.直接跟在右引号 * 后面的任何双引号 * 都被视为与双引号组相邻的纯展开文本(或其一部分),但只有一个双引号: "Tim says, ""Hi!"""将作为一个参数:Tim says, "Hi!" 因此,有三种不同类型的双引号:打开的引号、关闭的引号以及充当纯文本的引号。 以下是最后一行令人困惑的内容:
" open double-quote group
T inside ""s
i inside ""s
m inside ""s
inside ""s - space doesn't separate
s inside ""s
a inside ""s
y inside ""s
s inside ""s
, inside ""s
inside ""s - space doesn't separate
" close double-quoted group
" quote directly follows closer - acts as plain unwrapped text: "
H outside ""s - gets joined to previous adjacent group
i outside ""s - ...
! outside ""s - ...
" open double-quote group
" close double-quote group
" quote directly follows closer - acts as plain unwrapped text: "
"Tim said to him, """What's been happening lately?""""
将按预期打印Tim said to him, "What's been happening lately?"。因此,三个引号始终可以可靠地用作转义。 然而,在理解它时,你可能会注意到,结尾的四个引号可以减少到两个,因为它在技术上增加了另一个不必要的空双引号组。 下面是一些关闭它的例子:
program a b REM sends (a) and (b)
program """a""" REM sends ("a")
program """a b""" REM sends ("a) and (b")
program """"Hello,""" Mike said." REM sends ("Hello," Mike said.)
program ""a""b""c""d"" REM sends (abcd) since the "" groups wrap nothing
program "hello to """quotes"" REM sends (hello to "quotes")
program """"hello world"" REM sends ("hello world")
program """hello" world"" REM sends ("hello world")
program """hello "world"" REM sends ("hello) and (world")
program "hello ""world""" REM sends (hello "world")
program "hello """world"" REM sends (hello "world")
6条答案
按热度按时间y53ybaqx1#
另一种转义引号的方法(虽然可能不是最好的),我发现在某些地方使用的是使用多个双引号。为了使其他人的代码易读,我将进行解释。
这里有一组基本规则:
1.如果未包含在双引号组中,请用空格分隔参数:
program param1 param2 param 3
将向program.exe
传递四个参数:param1
、param2
、param
和3
。1.双引号组在向程序传递参数时忽略空格作为值分隔符:
program one two "three and more"
将向program.exe
传递三个参数:one
、two
和three and more
。* 现在解释一些混淆:*1.直接与未使用双引号换行的文本相邻的双引号组连接到一个参数中:
hello"to the entire"world
作为一个参数:helloto the entireworld
.* 注:前面的规则并不意味着两个双引号的组可以直接相邻出现。1.直接跟在右引号 * 后面的任何双引号 * 都被视为与双引号组相邻的纯展开文本(或其一部分),但只有一个双引号:
"Tim says, ""Hi!"""
将作为一个参数:Tim says, "Hi!"
因此,有三种不同类型的双引号:打开的引号、关闭的引号以及充当纯文本的引号。
以下是最后一行令人困惑的内容:
因此,文本有效地连接了四组字符(然而,其中一组没有字符):
Tim says,
是第一个, Package 以转义空格"Hi!
是第二个,没有换行(没有空格)``是第三个,一个双引号组,不包含任何内容
"
是第四个,展开的闭引号。正如您所看到的, Package nothing的双引号组仍然是必要的,因为如果没有它,下面的双引号将打开一个双引号组,而不是作为纯文本。
由此,应该可以看出,因此,内部和外部引号,三个双引号充当纯文本非转义双引号:
将按预期打印
Tim said to him, "What's been happening lately?"
。因此,三个引号始终可以可靠地用作转义。然而,在理解它时,你可能会注意到,结尾的四个引号可以减少到两个,因为它在技术上增加了另一个不必要的空双引号组。
下面是一些关闭它的例子:
最后一点:我没有从任何教程中读到这些-我通过实验想出了所有这些。因此,我的解释在内部可能并不正确。尽管如此,上面所有的例子都是按照给定的方式进行评估的,因此验证了(但不是证明)我的理论。
我在64位的Windows7上测试了这个功能,只使用了带有参数传递的 *.exe调用(不是 *.bat,但我认为它的工作原理是一样的)。
doinxwow2#
我无法快速重现症状:如果我用一个只包含
@echo.%1
甚至@echo.%~1
批处理文件myscript.bat
来尝试myscript '"test"'
,我会得到所有引号:'"test"'
也许你可以试试转义字符
^
,如下所示:myscript '^"test^"'
?lp0sw83n3#
试试这个:
“”转义为单个“。
wn9m85ua4#
Peter Mortensen在评论Codesmith的回答时引用的第二份文件使我更加清楚。该文档由windowsinspired.com编写。链接重复:A Better Way To Understand Quoting and Escaping of Windows Command Line Arguments。
一些进一步的试验和错误导致以下准则:
用插入符号
^
转义每个双引号"
。如果您希望其他对Windows命令shell具有特殊意义的字符(例如<
、>
、|
、&
)被解释为常规字符,则也可以使用插入符号对其进行转义。如果你想让你的程序 foo 接收命令行文本
"a\"b c" > d
并将其输出重定向到文件 out.txt,那么从Windows命令shell启动你的程序,如下所示:如果 foo 将
\"
解释为文字双引号,并期望使用未转义的双引号来分隔包含空格的参数,则 foo 将该命令解释为指定一个参数a"b c
,一个参数>
和一个参数d
。如果 foo 将双引号
""
解释为文字双引号,则启动程序为引用的文档中的关键见解是,对于Windows命令shell,未转义的双引号会触发在两种可能的状态之间切换。
一些进一步的尝试和错误意味着在初始状态下,重定向(到文件或管道)被识别,插入符号
^
转义双引号,插入符号从输入中删除。在另一种状态下,不识别重定向,插入符号不会转义双引号,也不会被删除。让我们分别将这些状态称为“外部”和“内部”。如果要重定向命令的输出,则命令shell在到达重定向时必须处于outside状态,因此重定向之前必须有偶数个未转义(用插入符号)的双引号。
foo "a\"b " > out.txt
不起作用--命令shell将整个"a\"b " > out.txt
作为其组合命令行参数传递给 foo,而不是只传递"a\"b "
并将输出重定向到 * out.txt *。foo "a\^"b " > out.txt
也不起作用,因为插入符号^
是在内部状态遇到的,它是一个普通字符而不是转义字符,所以"a\^"b " > out.txt
被传递给 foo。(希望)始终有效的唯一方法是将命令shell始终保持在outside状态,因为这样重定向才有效。
如果你不需要重定向(或者其他对命令shell有特殊意义的字符),那么你可以不使用插入符号。如果 foo 将
\"
解释为文字双引号,则可以将其调用为然后 foo 接收
"a\"b c"
作为其组合参数文本,并可以将其解释为等于a"b c
的单个参数。现在--最后--回到最初的问题。从Windows命令shell调用的
myscript '"test"'
将'"test"'
传递给 myscript。显然,myscript 将单引号和双引号解释为参数分隔符并删除它们。您需要弄清楚 myscript 接受什么作为文字双引号,然后在命令中指定它,使用^
转义任何对Windows命令shell有特殊意义的字符。假设myscript
也可以在Unix上使用,那么\"
可能就能做到这一点。试试看或者,如果您不需要重定向,
fykwrbwg5#
我从cmd调用powershell,传递引号和转义都不起作用。严重的口音工作,以避免双引号在这个Win 10表面亲。
下面是我得到的其他字符转义双引号的输出:
使用另一个引号转义引号会导致没有引号。正如您所看到的,字符本身被键入,但没有转义双引号。
tuwxkamq6#
也许您来到这里,是因为您想知道如何在
cmd.exe
上传递给/c
的命令中转义引号?你不知道:将执行
这真的是我第一眼看到时没有想到的行为。