在Unix中,我可以运行,myscript '"test"'
并且可以运行"test"
。
在Windows中,cmd
我得到了'test'
。
如何传递双引号作为参数?我想知道如何从cmd
窗口手动执行此操作,因此不必编写程序来测试程序。
在Unix中,我可以运行,myscript '"test"'
并且可以运行"test"
。
在Windows中,cmd
我得到了'test'
。
如何传递双引号作为参数?我想知道如何从cmd
窗口手动执行此操作,因此不必编写程序来测试程序。
Answers:
我无法快速重现这些症状:如果尝试myscript '"test"'
使用myscript.bat
包含just @echo.%1
或even 的批处理文件,则会@echo.%~1
得到所有引号:'"test"'
或许你可以尝试转义字符^
是这样的:myscript '^"test^"'
?
wscript
错的!留给Windows :)
cmd
。
我发现在某些地方使用的另一种转义引号(虽然可能不是首选)是使用多个双引号。为了使其他人的代码清晰易懂,我将进行解释。
这是一组基本规则:
program param1 param2 param 3
将通过四个参数program.exe
:param1
,param2
,param
,和3
。program one two "three and more"
将通过三个参数program.exe
:one
,two
和three and more
。hello"to the entire"world
用作一个参数:helloto the entireworld
。"Tim says, ""Hi!"""
将用作一个参数:Tim says, "Hi!"
因此,存在三种不同类型的双引号:打开的引号,关闭的引号和充当纯文本的引号。
这是最后一条令人困惑的行的细目:
“打开双引号组 内的T 我在里面 在“ s”内 内的-空间不会分开 在“”内 里面的一个 在“”内的y 在“”内 ,在“”内 内的-空间不会分开 “封闭双引号组 “引号紧随其后-用作普通的未包装文本:” 以外的H-加入先前的相邻群组 我在外面-- !外面的“”-... “打开双引号组 “封闭双引号组 “引号紧随其后-用作普通的未包装文本:”
因此,文本有效地连接了四个字符组(但是,一个字符什么都没有):
Tim says,
是第一个字符,被包装以转义空格以逃避
"Hi!
是第二个,没有包装的字符(没有空格)
是第三个,双引号组则不包含任何字符
"
是第四个,展开后的收盘价。
如您所见,不包含任何内容的双引号组仍然是必需的,因为没有它,下面的双引号将打开一个双引号组,而不是充当纯文本。
由此可见,在内部和外部引号中,三个双引号充当纯文本未转义的双引号:
“蒂姆对他说,”“”最近发生了什么事?”
将按Tim said to him, "What's been happening lately?"
预期打印。因此,三个引号始终可以可靠地用作转义符。
但是,在理解它时,您可能会注意到,由于技术上会添加另一个不必要的空双引号组,因此末尾的四个引号可以减少为仅两个。
下面是一些关闭它的示例:
程序ab REM发送(a)和(b) 程序“”“ a”“” REM发送(“ a”) 程序“”“ a b”“” REM发送(“ a)和(b”) 程序“”“”你好,“”“迈克说。” REM发送(“您好,”迈克说。) 程序“” a“” b“” c“” d“” REM发送(abcd),因为“”组不包裹任何内容 REM发送的程序“ hello to“”“ quotes”“(您好,” quotes“) 程序“”“” hello world“” REM发送(“ hello world”) 程序“”“”你好“世界”“ REM发送(”你好世界“) 程序“”“”你好“世界”“ REM发送(”你好)和(世界“) 程序“ hello“” world“”“ REM发送(hello” world“) 程序“ hello”“” world“” REM发送(hello“ world”)
最后的注意事项:我没有从任何教程中阅读任何内容-我通过实验提出了所有这些内容。因此,我的解释在内部可能并不正确。但是,以上所有示例均按给定值进行了评估,从而验证了(但未证明)我的理论。
我在Windows 7 64位系统上仅通过带有参数传递的* .exe调用(而不是* .bat)对此进行了测试,但我想它的工作原理相同。
试试这个:
myscript """test"""
参数中的“”转义为单个”。
myscript """test test"""
,它不起作用(第一个参数作为传递"test
。Acutally,您需要使用三个引号:myscript """"test test""
但是,可以跳过结尾的第三个引号。–
char **argv
使用诸如spawn
或函数从C启动器传递到另一个进程时,这对我有所帮助exec
。谢谢。:-)
彼得·莫滕森(Peter Mortensen)在他对Codesmith的回答的评论中引用的第二份文件对我来说更清楚了。该文档由windowsinspired.com编写。重复了该链接:了解Windows命令行参数的引用和转义的更好方法。
一些进一步的尝试和错误导致了以下准则:
"
用尖号转义每个双引号^
。如果你想其他字符有特殊意义的Windows命令外壳(例如<
,>
,|
,&
)被解释为常规字符代替,然后用尖逃避他们。
如果要让程序foo接收命令行文本"a\"b c" > d
并将其输出重定向到文件out.txt,则可以从Windows命令外壳按如下所示启动程序:
foo ^"a\^"b c^" ^> d > out.txt
如果foo解释\"
为文字双引号,并期望未转义的双引号分隔包括空格的参数,则foo会将命令解释为指定一个参数a"b c
,一个参数>
和一个参数d
。
相反,如果foo将双引号双引号解释""
为文字双引号,则以
foo ^"a^"^"b c^" ^> d > out.txt
引用文件的主要见解是,对于Windows命令外壳,未经转义的双引号会触发两个可能状态之间的切换。
某些进一步的试验和错误意味着在初始状态下,将识别到(到文件或管道的)重定向,并且插入符号^
转义双引号,并且将插入符号从输入中删除。在另一种状态下,无法识别重定向,并且脱字符号不会转义双引号并且不会被删除。让我们将这些状态分别称为“外部”和“内部”。
如果要重定向命令的输出,则命令外壳在到达重定向时必须处于外部状态,因此重定向之前必须有偶数个未转义的(由脱字符号引起的)双引号。 foo "a\"b " > out.txt
将不起作用-命令外壳将整个传递"a\"b " > out.txt
给foo作为其组合的命令行参数,而不是仅传递"a\"b "
并将输出重定向到out.txt。
foo "a\^"b " > out.txt
也不起作用,因为插入符^
是在内部状态遇到的,内部状态是普通字符而不是转义字符,因此"a\^"b " > out.txt
将其传递给foo。
(希望)始终有效的唯一方法是将命令外壳始终保持在外部状态,因为这样重定向才能起作用。
如果您不需要重定向(或其他对命令外壳具有特殊含义的字符),则可以不用插入符号。如果foo解释\"
为文字双引号,则可以将其称为
foo "a\"b c"
然后foo接收"a\"b c"
作为其组合参数文本,并且可以将其解释为等于的单个参数a"b c
。
现在-最后-原来的问题。 myscript '"test"'
从Windows命令shell调用传递'"test"'
给myscript。显然,myscript将单引号和双引号解释为参数定界符并将其删除。您需要找出myscript作为文字双引号接受的内容,然后在命令中进行指定,^
以转义Windows命令外壳中所有具有特殊含义的字符。鉴于myscript
在Unix上也可以使用,也许\"
就可以了。尝试
myscript \^"test\^"
或者,如果您不需要重定向,
myscript \"test\"
myscript \"test\"