我遇到了Windows命令解释器的一个非常奇怪的问题.它出现在XP和Windows 7上.我的描述适用于Perl脚本,但是这个问题适用于在命令行上运行任何类型的程序,它接受命令行参数.
对于测试我使用的是Perl脚本check-params.pl,它只是输出它所看到的参数 -
use strict;
use warnings;
while (my $param = shift @ARGV) {
print "Param: [$param]\n";
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我跑 -
perl check-params.pl "a b|<>" c^|^<^>cc
Run Code Online (Sandbox Code Playgroud)
然后输出是
[Param: a b|<>]
[Param: c|<>cc]
Run Code Online (Sandbox Code Playgroud)
正如所料.特殊的字符| <>在双引号内工作正常,但在外部引号时,你用^来转义它们.
但是,当引用的参数添加双引号时,例如
perl check-params.pl "a\" b|<>"
Run Code Online (Sandbox Code Playgroud)
然后我得到错误 -
> was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)
但如果双引号出现在特殊字符|之后 <或>,然后它工作正常.
你可以通过转义特殊的|来轻松解决这个问题 <> char,带引号参数内的^.例如
perl check-params.pl "a\" b^|"
Run Code Online (Sandbox Code Playgroud)
但是,转义的双引号不仅影响特殊字符| 当前参数中的<> 但它会影响任何后续参数中的这些特殊字符.
例如,如果我这样做 -
perl check-params.pl "aa \"bb" ccc | perl check-pipe.pl
Run Code Online (Sandbox Code Playgroud)
(check-pipe.pl只需输出管道收到的东西 -
use strict; …Run Code Online (Sandbox Code Playgroud)