我有一组字符串,希望能够在单个Windows命令行调用中将这些字符串作为参数传递。对于简单的字母数字字符串,直接按原样传递即可:
> script.pl foo bar baz yes no
foo
bar
baz
yes
no
我知道如果一个参数包含空格或双引号,我需要反斜杠转义双引号和反斜杠,然后将参数用双引号括起来。
> script.pl foo bar baz "\"yes\"\\\"no\""
foo
bar
baz
"yes"\"no"
但是当我尝试传递带有字面百分号的参数时,会出现以下情况:
> script.pl %PATH%
C:\Program
Files\PHP\;C:\spaceless\perl\bin\;C:\Program
Files\IBM\Java60\bin;
(...etc.)
双引号无法使用:
> script.pl "%PATH%"
C:\Program Files\PHP\;C:\spaceless\perl\bin\;C:\Program Files\IBM\Java60\bin; (...etc.)
也不要反斜杠转义(注意输出中反斜杠的存在):
> script.pl \%PATH\%
\%PATH\%
此外,反斜杠转义反斜杠的规则不一致:
> script.pl "\\yes\\"
\\yes\
> script.pl "\yes\\"
\yes\
> script.pl "\yes\"
\yes"
此外,毫无疑问,在Windows命令行shell中有特殊字符,就像所有的shell一样。那么,在Windows命令行中安全转义任意命令行参数的一般过程是什么呢?
理想的答案将描述一个可以在以下情况下使用的函数escape()(Perl示例):
$cmd = join " ", map { escape($_); } @args;
以下是一些更多的字符串示例,这些字符串应该通过此函数进行安全转义(我知道其中一些看起来类似于Unix,这是故意的):
yes
no
child.exe
argument 1
Hello, world
Hello"world
\some\path with\spaces
C:\Program Files\
she said, "you had me at hello"
argument"2
\some\directory with\spaces\
"
\
\\
\\\
\\\\
\\\\\
"\
"\T
"\\T
!1
!A
"!\/'"
"Jeff's!"
$PATH
%PATH%
&
<>|&^
()%!^"<>&|
>\\.\nul
malicious argument"&whoami
*@$$A$@#?-_
^"C:\Program Files\p.pl^"
会产生'"C:\Program' is not recognized as an internal or external command, operable program or batch file.
的错误信息。有什么想法吗? - qntm