Windows命令行参数的转义(dos/cmd.exe下输入双引号竖扛等特殊字符)

 

本文摘要
我前不久就碰到了。设了密码,输入1~8的shift键,后来再次3389,始终不对,严重怀疑我的记忆力。。。。。。
  先来测试一下:

  net user admin !@#$%^&*

  你说你登陆的时候输入密码是什么?

  我前不久就碰到了。设了密码,输入1~8的shift键,后来再次3389,始终不对,严重怀疑我的记忆力。。。。。。

  后来echo 一下上面的命令,发现密码竟然是:!@#$%&

  (少了个^呀)。原因自己找吧。

  再来一个测试:如果你的密码是 abc""abc (中间两个双引号是作为密码的)。

  用命令你怎么输入呢?哈哈。

  也很简单,另外一个转移,一个双引号输入三个三引号。

  那么上面的密码console中应该输入: abc""""""abc (中间6个双引号)。

  具体参照:http://www.streamlet.org/en/view.asp?id=14

  这儿贴过原文来:

  Windows 命令行参数的转义

  Article Type: Reproduced Publish time: 2009-10-15 21:48:00 Clicks: 578

  Reproduced from: http://hi.baidu.com/atry/blog/item/1687c05cf9bb0a49faf2c05f.html

  Windows命令行参数的转义分为两个步骤,第一个步骤是cmd解析你输入的字符串决定要启动哪些进程,进程之间是否要标准输入输出重定向等等;第二个步骤是CRT把传入进程的命令行字符串切成多个参数,填好argc和argv传入main。

  如果一个程序不是被cmd启动的,而是通过快捷方式或者bash等别的shell启动的,或者干脆直接调用API CreateProcess,那么第一个步骤可以无视;如果一个程序并不使用argc、argv,而自行调用GetCommandLine等Windows API,则第二个步骤可以无视。

  第一个步骤中,| ^ " &等字符是特殊字符。如果特殊字符出现在双引号外,需要被转义。但如果出现在双引号中,就不需要也不能被转义。转义时,^^代表^,^|代表|,^"代表"等等

  第二个步骤的具体实现取决于CRT,在Windows XP中用得最广泛的CRT是msvcrt.dll。Windows XP附带的系统程序大都使用了它,用VC6或mingw的gcc编译的程序也使用这个CRT。我看了一下VC6附带的源码,切参数这件事情的规则相当复杂。

  首先是空格和tab如果不在双引号,就会被当作参数的分隔符,而双引号引住的空格和tab代表空格tab字符本身。

  其次是连写双引号的特殊处理。如果想要把双引号作为参数内的字符,那么至少要连写两个双引号:""。当他遇见连续的两个双引号时,他会把其中一个双引号作为双引号字符,另一个双引号作为引用范围的开始或结束。也就是说,如果你已经在引号中了,连写2个双引号的话,就会产生一个"字符,并且关闭引用。要想产生一个"字符但不改变引用状态,就需要连写三个双引号"""。

  最变态的是用反斜杠(即)转义的规则。对于n个反斜杠外加一个双引号会被转义。如果n为奇数,那么会被转义成(n-1)/2个字符外加一个"字符。如果n为偶数,那么会被转义成n/2个字符,然后再进入或结束引用范围。而如果反斜杠后面并不跟随双引号,反斜杠就不转义。

  值得注意的是,因为cmd和CRT对双引号字符的转义规则并不一致,所以cmd和CRT对于某个字符是否被引用的判断也是不一致的。比如说,如果你想进行一次Subversion提交,注释中写上

  hello " | " | " | " world

  ,那你得写:

  svn commit -m "hello """ ^| """ | """ ^| """ world"

  注意,其中某些|必须要转义,而另一些则必须不转义。

  上面说的还仅仅是msvcrt.dll切参数的规则,这个规则和cygwin的CRT是不一致的,也就是说,如果你在cmd中要调用cygwin编译的程序,那么转义规则又不一样。幸好这种情况并不是很多,用cygwin的话,就用bash好了,至少全世界的bash解析参数的方式都一样。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值