Windows 参数中的转义双引号

Windows 参数中的转义双引号,windows,cmd,Windows,Cmd,在Unix中,我可以运行myscript的“test”,然后得到“test” 在Windowscmd中,我得到了的“测试” 如何将双引号作为参数传递?我想知道如何从cmd窗口手动执行此操作,这样我就不必编写程序来测试我的程序。我无法快速重现症状:如果我尝试使用批处理文件myscript.bat仅包含@echo.%1甚至@echo.%1来执行myscript''test',则,我得到了所有的引号:“test” 也许您可以尝试转义字符^如下:myscript'^“test^”?另一种转义引号的方法(

在Unix中,我可以运行
myscript的“test”
,然后得到
“test”

在Windows
cmd
中,我得到了
的“测试”


如何将双引号作为参数传递?我想知道如何从
cmd
窗口手动执行此操作,这样我就不必编写程序来测试我的程序。

我无法快速重现症状:如果我尝试使用批处理文件
myscript.bat
仅包含
@echo.%1
甚至
@echo.%1
来执行
myscript''test'
,则,我得到了所有的引号:
“test”


也许您可以尝试转义字符
^
如下:
myscript'^“test^”

另一种转义引号的方法(虽然可能不可取),我发现在某些地方使用的方法是使用多个双引号。为了让别人的代码清晰易读,我会解释

以下是一组基本规则:

  • 当不在双引号组中包装时,用空格分隔单独的参数:
    program param1 param2 param 3
  • 将向
    program.exe
    传递四个参数:
    param1
    param2
    param
    3
  • 双引号组在向程序传递参数时忽略空格作为值分隔符:
    program one两个“三个及以上”
    将向
    program.exe
    传递三个参数:
    one
    two
    two
  • 现在来解释一些困惑:
  • 与未使用双引号包装的文本直接相邻的双引号组连接到一个参数中:
    hello“到整个“世界”
    充当一个参数:
    hello到整个“世界”
  • 注意:前面的规则并不意味着两个双引号组可以直接相邻出现。
  • 任何紧跟在结束引号之后的双引号都被视为(或作为)与双引号组相邻的未包装纯文本,但只有一个双引号:
    “Tim说”“嗨!”
    将充当一个参数:
    Tim说:“嗨!”
  • 因此,有三种不同类型的双引号:打开的引号、关闭的引号和作为纯文本的引号。
    下面是最后一行令人困惑的内容:

    " 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: " 威尔·普雷特
    蒂姆对他说,“最近发生了什么事?”
    一如预期。因此,三个引号始终可以可靠地用作转义。
    但是,在理解它时,您可能会注意到,末尾的四个引号可以减少为两个引号,因为从技术上讲,这是在添加另一个不必要的空双引号组

    下面是一些例子来结束它:

    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") 程序a b REM发送(a)和(b) 程序“a”REM发送(“a”) 程序“a b”REM发送(“a)和(b”) 程序“你好”,迈克说,“雷姆发了一封邮件(“你好”,迈克说。) 程序“a”“b”“c”“d”REM发送(abcd),因为“组”不包装任何内容 REM发送的“hello to”“quotes”程序(hello to“quotes”) 程序“hello world”REM发送(“hello world”) REM发送的程序“hello”world(“hello world”) 程序“hello”world REM发送(“hello”)和(world) 程序“hello”“world”“REM发送(hello“world”) 程序“hello”“world”“REM发送(hello“world”) 最后一点注意:我没有从任何教程中读到这些内容——我是通过实验得出的。因此,我的解释在内部可能不正确。尽管如此,上面所有的例子都按照给定的方式进行评估,从而验证(但不是证明)我的理论

    我在64位Windows 7上测试了这一点,只使用了带有参数传递的*.exe调用(不是*.bat,但我认为它的工作原理是相同的)。

    尝试以下方法:

    myscript """test"""
    

    参数中的“escape to a single”。

    Peter Mortensen在评论Codesmith的答案时引用的第二个文档让我更清楚了。该文档由windowsinspired.com编写。重复链接:

    进一步的尝试和错误导致以下准则:

    用插入符号将每个双引号转义
    ^
    。如果您希望Windows命令shell中具有特殊含义的其他字符(例如,
    |
    &
    )被解释为常规字符,则也可以使用插入符号对其进行转义。

    如果希望程序foo接收命令行文本
    “a\“b c”>d
    ,并将其输出重定向到file out.txt,则从Windows命令行启动程序,如下所示:

    foo ^"a\^"b c^" ^> d > out.txt
    
    如果foo将
    \“
    解释为一个文本双引号,并希望不带转义的双引号来分隔包含空格的参数,那么foo将该命令解释为指定一个参数
    a“bc
    ,一个参数
    ,以及一个参数
    d

    如果foo将双引号
    解释为文本双引号,则按如下方式启动程序:

    foo ^"a^"^"b c^" ^> d > out.txt
    
    从引用的文档中可以看出,对于Windows命令shell来说,一个未切换的双引号触发了两种可能的状态之间的切换

    进一步的试验和错误表明,在初始状态下,重定向(到文件或管道)被识别,插入符号转义为双引号,并从输入中删除该插入符号。在另一种状态下,重定向不被识别,插入符号不转义为双引号且未删除。让我们分别将这些状态称为“外部”和“内部”

    如果要重定向命令的输出,则命令外壳在到达重定向时必须处于外部状态,因此在重定向之前必须有偶数个未转义(通过插入符号)双引号。
    foo“a\”b“>out.txt
    不起作用-命令外壳传递
    foo ^"a^"^"b c^" ^> d > out.txt
    
    foo "a\"b c"
    
    myscript \^"test\^"
    
    myscript \"test\"
    
    >powershell.exe "echo la`"" >> test
    >type test
    la"
    
    la\
    la^
    la
    la~