windows - 转义参数中的双引号

标签 windows cmd

在 Unix 中,我可以运行 myscript '"test"' 并得到 "test"

在 Windows cmd 中,我得到了 'test'

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

最佳答案

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

这是一组基本规则:

  1. 当不包含在双引号组中时,空格分隔参数:
    program param1 param2 param 3 将传递四个参数给program.exe:
    /> param1param2param3
  2. 双引号组在将参数传递给程序时忽略空格作为值分隔符:
    程序一二“三及更多”将传递三个参数给program.exe:
    一个两个三个及更多
  3. 现在解释一些混淆:
  4. 与未用双引号包裹的文本直接相邻的双引号组连接到一个参数中:
    hello"to the entire"world 充当一个参数:向整个世界问好
  5. 注意:前面的规则并不意味着两个双引号组可以直接相邻出现。
  6. 任何双引号直接跟在结束引号之后都被视为(或作为)与双引号组相邻的普通展开文本,但只有一个双引号:
    "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 说, 是第一个,包装以避开空格
"Hi! 是第二个,没有换行(没有空格)
是第三个,一个双引号组,不包含任何内容
" 是第四个,展开的闭引号。

如您所见,双引号组仍然是必需的,因为没有它,下面的双引号将打开一个双引号组,而不是充当纯文本。

从这里应该可以看出,因此,内外引号,三个双引号充当纯文本未转义双引号:

"Tim said to him, """What's been happening lately?""""

将按预期打印 Tim 对他说:“最近发生了什么事?”。因此,三个引号始终可以可靠地用作转义符。
但是,在理解它时,您可能会注意到末尾的四个引号可以减少到仅仅两个,因为它在技术上添加了另一个不必要的空双引号-引用组。

这里有几个关闭它的例子:

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

最后说明:我没有从任何教程中阅读任何内容 - 我通过实验得出了所有这些内容。因此,我的解释在内部可能不正确。尽管如此,上面所有的例子都按给定的方式评估,从而验证(但不是证明)我的理论。

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

关于windows - 转义参数中的双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7760545/

相关文章:

windows - 由未知权威签署的证书

windows - NtQuerySystemInformation SystemHandleInformation 不会给出正确的返回大小

c++ - 如何在驱动程序的 INF 文件中使用变量?

windows - 如何将 Windows cmd stdout 和 stderr 重定向到单个文件?

mysql - 为什么我在尝试更改密码时在 cmd 中收到 MySQL 错误?

c++ - 'CheckTokenMembership' 检查管理员权限 C++

c - WM_SYSCOLORCHANGE 消息的含义

python-3.x - 如何在 Atom 编辑器中打开命令提示符?

batch-file - 将多个脚本打包到一个 .cmd 文件中

windows - 在 "if" block 中设置变量