Как мне избежать произвольной строки для использования в качестве аргумента командной строки в Windows ?

У меня есть список строк, и я хочу передать эти строки в качестве аргументов в одном вызове командной строки 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, как и во всех оболочках. Какова же тогда общая процедура безопасного экранирования произвольных аргументов командной строки для использования в командной строке 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$@#?-_
6
задан qntm 12 July 2011 в 17:08
поделиться