在参数中使用双引号
在UNIX中,我可以运行myscript '"test"'
,我会得到"test"
在Windows cmd
我得到'test'
我怎么能通过双引号作为参数? 我想知道如何从cmd
窗口手动执行此操作,所以我不必编写程序来testing我的程序。
我不能很快地重现症状:如果我用包含@echo.%1
甚至@echo.%~1
的batch filemyscript.bat
尝试myscript '"test"'
,我会得到所有的引号: '"test"'
也许你可以尝试转义字符^
像这样: myscript '^"test^"'
?
另一种逃避引号的方式(虽然可能不是最好),我发现在某些地方使用的是使用多个双引号 。 为了让其他人的代码清晰可辨,我会解释一下。
这是一套基本规则:
- 当不包含在双引号组中时,空格分隔参数:
program param1 param2 param 3
会传递四个参数给program.exe
:
param1
,param2
,param
和3
。 - 将parameter passing给程序时,双引号组忽略空格作为值分隔符:
program one two "three and more"
将三个parameter passing给program.exe
:
one
,two
,three and more
。 - 与双引号不直接相邻的双引号组合并成一个参数:
hello"to the entire"world
作为一个参数:helloto the entireworld
。 - 任何直接在结束引号之后的双引号将被视为(或作为)与双引号组相邻的简单展开文本的一部分,但只有一个双引号:
"Tim says, ""Hi!"""
将作为一个参数:Tim says, "Hi!"
现在来解释一些困惑:
注:以前的规则并不意味着两个双引号的组可以直接相邻。
因此,有三种不同types的双引号:引用引用,引用引用,引用明文。
以下是最后一个令人困惑的一行:
“打开双引号组 T里面的“s” 我在里面 里面的“s” 里面的空间不分开 在里面 一个里面的“s” 在“”里面 在里面 ,在“s”里面 里面的空间不分开 “密切的双引号组 “引用直接跟随 - 作为简单的解包文本:” 外面的“H”join到前一个相邻的组中 我在外面“” - ... ! 外面“”s - ... “打开双引号组 “密切的双引号组 “引用直接跟随 - 作为简单的解包文本:”
因此,文本有效地join了四组字符(但是没有任何一个):
Tim says,
是第一个,包裹逃离的空间
"Hi!
是第二个,没有包裹(没有空格) 是第三个,双引号的小组什么也没有包装
"
是第四个,解开了接近报价。
正如你所看到的那样,这个双引号的小组仍然是不必要的,因为如果没有它,下面的双引号将会打开一个双引号的小组而不是纯文本。
由此可见,应该认识到,因此,在内外引用中,三个双引号作为一个明文无误的双引号:
“Tim对他说:”“最近发生了什么事?”“”“
Tim said to him, "What's been happening lately?"
会打印Tim said to him, "What's been happening lately?"
如预期。 因此,三个引号总能可靠地用作逃避。
但是,在理解它的时候,你可能会注意到最后的四个引号可以减less到两个,因为它在技术上是增加了一个不必要的空双引号组。
以下是一些closures它的例子:
程序ab REM发送(a)和(b) 程序“”“”“”“”REM发送(“a”) 程序“”“ab”“”REM发送(“a”和“b”) 程序“”“”你好,“”迈克说。 REM发送(“你好,”Mike说。) 程序“”a“”b“”c“”d“”REM发送(abcd),因为“”组不包装 程序“hello to”“”quotes“”REM发送(hello to“quotes”) 节目“”“”你好世界“”REM发送(“你好世界”) 节目“”“你好”世界“”REM发送(“你好世界”) 程序“”“你好”世界“”REM发送(“你好”)和“(世界)” 节目“你好”“世界”“”REM发送(你好“世界”) 节目“你好”“”世界“”REM发送(你好“世界”)
最后说明:我没有从任何教程中读到任何这个 – 我通过实验提出了所有这些。 所以我的解释在内部可能不是真的。 尽pipe如此,上面的所有例子都是按照给定的方式来评估的,从而证实了(但不是certificate)我的理论。
我testing了这个在Windows 7,64位只使用* .exe调用parameter passing(不* * .bat,但我想它的工作原理是一样的)。
尝试这个:
myscript """test"""
在参数中“跳转到单个”。