Windows命令解释器遇到了一个非常奇怪的问题。它同时在XP和Windows 7上都发生。我的描述适用于Perl脚本,但是此问题适用于在使用命令行参数的命令行上运行任何类型的程序。为了进行测试,我使用了Perl脚本check-params.pl,该脚本仅输出它所看到的参数-use strict;use warnings;while (my $param = shift @ARGV) { print "Param: [$param]\n";}因此,如果我运行-perl check-params.pl "a b|<>" c^|^<^>cc然后输出是[Param: a b|<>][Param: c|<>cc]如预期的那样。特殊字符| 在双引号内可以很好地工作,但是当在双引号内时,您可以使用^将其转义。但是,当在引用的参数中添加双引号时,例如perl check-params.pl "a\" b|<>"然后我得到了错误-> was unexpected at this time.但是,如果双引号后面有特殊字符| ,则工作正常。您可以通过转义特殊字符|来轻松解决此问题。带有引号的参数内带有^的字符。例如perl check-params.pl "a\" b^|"但是,转义的双引号不仅会影响特殊字符|当前参数中的,但会影响任何后续参数中的这些特殊字符。例如,如果我这样做-perl check-params.pl "aa \"bb" ccc | perl check-pipe.pl(其中check-pipe.pl仅输出管道收到的内容-use strict;use warnings;while (<STDIN>) { print "PIPE RECEIVED ---> $_";})然后输出是-Param: [aa "bb]Param: [ccc]Param: [|]Param: [perl]Param: [check-pipe.pl]即,它对待管道|作为文字字符,并且不会出现任何管道。有没有人对此问题有任何经验,并且知道任何解决方法?我已经编写了一些Perl脚本来处理Web日志文件,其中一个使用了正则表达式,并在命令行中将其传递给带引号的参数。正则表达式可能包含诸如|的字符。 ,并且也可能有双引号,我将其输入为\“。因此上述问题浮出水面。任何帮助,不胜感激,谢谢。感谢您的答复,但是在XP SP3上尝试使用Perl脚本时,会看到两个命令行参数。此问题与Perl无关,例如echo "a \"b|c"产生错误-'c"' is not recognized as an internal or external command,operable program or batch file.但echo "a b|\"c"起作用,因为\“紧跟在特殊字符|之后。它必须是命令解释器中的错误。我将有兴趣了解更多有关此问题,并在可能的情况下找到解决方法。这个问题弄乱了运行一些有用的脚本。对于命令解释器来说,这是一个非常明显的问题。我也在Windows 7上尝试过,并且上面的回声测试也发生了同样的问题。 附加信息:我已经更新了脚本check-params.pl和check-pipe.pl以提供更多有用的信息:-check-params.pl:-use strict;use warnings;while (my $param = shift @ARGV) { print "COMMAND LINE RECEIVED: [$param]\n";}check-pipe.pl:-use strict;use warnings;while (<STDIN>) { print "PIPE RECEIVED: $_";}while (my $param = shift @ARGV) { print "COMMAND LINE RECEIVED: [$param]\n";}例如运行:-perl pl/utils/check-params.pl l1 l1-b l1-c | perl pl/utils/check-pipe.pl l2 l2-b | perl pl/utils/check-pipe.pl l3 l3-b | perl pl/utils/check-pipe.pl united arsenal rangers raith产生输出:-PIPE RECEIVED: PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l1]PIPE RECEIVED: PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l1-b]PIPE RECEIVED: PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l1-c]PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l2]PIPE RECEIVED: PIPE RECEIVED: COMMAND LINE RECEIVED: [l2-b]PIPE RECEIVED: COMMAND LINE RECEIVED: [l3]PIPE RECEIVED: COMMAND LINE RECEIVED: [l3-b]COMMAND LINE RECEIVED: [united]COMMAND LINE RECEIVED: [arsenal]COMMAND LINE RECEIVED: [rangers]COMMAND LINE RECEIVED: [raith]从而确认此命令行将按预期工作。这些脚本可在命令行上与任意数量的管道一起使用。 附加信息:我发现我可以使用多种解决方法来使它正常工作-例如,Harry提到的^“是一个示例。有时您可以修改正则表达式以避免使用”。当特殊字符| 之前有两个\“序列时,则不会发生此问题。在运行任何命令之前,我运行check-params.pl和check-pipe.pl来验证Perl脚本如何查看命令行参数,例如,上面对我的OP所做的编辑描述了这些脚本,这些脚本是我自OP以来进行的修改。 最佳答案 \“中的双引号被认为与初始双引号匹配,以引号参数结尾。要在双引号中包含双引号,请使用两个双引号:perl check-params.pl "a"" b|<>"应该产生预期的结果,具体取决于perl.exe解析命令行参数的方式(我已经使用命令脚本进行了测试,因为我没有安装Perl)。您需要更改脚本,以便将“”而不是“\”视为双引号。 附加:此命令行echo "a \"b|c"导致启动c" is not recognized的错误消息。 这不是错误。 反斜杠不是转义字符,因此命令行包含一个带引号的字符串("a \"),后跟一个管道(|),该管道使其余部分(c")成为附加命令,该命令将通过回显命令的输出传递到该命令中。如果你反而说echo "a ""b|c"那么只有一个带引号的字符串("a ""b|c"),它将按预期工作。不幸的是,我现在可以确认ActivePerl的命令行解析会导致perl check-params.pl "a"" b|"分为两个参数。您可能需要获取整个命令行(如果在Perl中可以做到这一点)并自己解析。 其他:perl check-params.pl ^"a\^" b^|c^"产生期望的结果。这是通过转义所有特殊字符(包括引号)来实现的。关于windows - Windows命令提示符中的转义双引号副作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7939642/
10-11 11:15