Как защитить кавычки в командном файле? - PullRequest
5 голосов
/ 25 сентября 2008

Я хочу обернуть Perl однострочником в пакетный файл. Для (тривиального) примера, в оболочке Unix, я мог бы процитировать такую ​​команду:

perl -e 'print localtime() . "\n"'

Но DOS подавляет это полезным сообщением об ошибке:

Невозможно найти терминатор строки "'" где-либо до EOF в строке -e 1.

Какой лучший способ сделать это в файле .bat ?

Ответы [ 5 ]

13 голосов
/ 25 сентября 2008

Для Perl в Windows я стараюсь использовать как можно больше обобщенных кавычек, чтобы у меня не было синдрома наклоняющейся зубочистки. Я сохраняю цитаты для вещей, которые нужны DOS:

perl -e "print scalar localtime() . qq(\n)"

Если вам просто нужен перевод строки в конце печати, вы можете позволить переключателю -l сделать это за вас:

perl -le "print scalar localtime()"

Для других интересных вещей, которые вы можете сделать с переключателями, см. Документацию perlrun .

8 голосов
/ 25 сентября 2008

В Windows «DOS prompt» (cmd.exe) вам нужно использовать двойные кавычки, а не одинарные. Внутри процитированного кода Perl, Perl дает вам много возможностей. Три из них:

perl -e "print localtime() . qq(\n)"
perl -e "print localtime() . $/"
perl -le "print ''.localtime()"

Если у вас Perl 5.10 или новее:

perl -E "say scalar localtime()"

Благодаря J.F. Комментарий Себастьяна .

2 голосов
/ 02 октября 2008

Для обычных пакетных файлов в Windows NT + символ ^ экранирует множество вещей (<> | &), но для кавычек их удвоение творит чудеса:

C:\>perl -e "print localtime() . ""\n"""
Thu Oct  2 09:17:32 2008
1 голос
/ 25 сентября 2008

Во-первых, любой ответ, который вы получите на это, зависит от команды, потому что оболочка DOS не анализирует командную строку, как uniq; он передает всю неразобранную строку команде, которая выполняет любое разбиение. Тем не менее, при использовании / subsystem: console среда выполнения C обеспечивает разбиение перед вызовом main (), и большинство команд используют это.

Если приложение использует это разбиение, способ ввода буквенных двойных кавычек заключается в его удвоении. Так что вы бы сделали

perl -e "print localtime() . ""\n"""
1 голос
/ 25 сентября 2008

В DOS вы используете "" вокруг вашей команды Perl. Оболочка DOS не делает одинарных кавычек, как обычная оболочка Unix:

perl -e "print localtime();"
...