Как мне защитить кавычки в пакетном файле?
-
02-07-2019 - |
Вопрос
Я хочу завернуть Однострочный язык Perl в пакетном файле.Для (тривиального) примера, в оболочке Unix, я мог бы заключить в кавычки команду, подобную этой:
perl -e 'print localtime() . "\n"'
Но DOS заглушает это полезным сообщением об ошибке:
Не удается найти строковый ограничитель "'" нигде перед EOF at -e в строке 1.
Каков наилучший способ сделать это в рамках файл .bat?
Решение
Для работы с Perl в Windows я стараюсь как можно чаще использовать обобщенное цитирование, чтобы у меня не возникло синдрома наклоняющейся зубочистки.Я сохраняю цитаты для тех материалов, которые нужны DOS:
perl -e "print scalar localtime() . qq(\n)"
Если вам просто нужен перевод строки в конце печати, вы можете позволить -l
переключатель сделает это за тебя:
perl -le "print scalar localtime()"
О других интересных вещах, которые вы можете сделать с помощью переключателей, смотрите В perlrun ( перлран ) Документация.
Другие советы
В "командной строке DOS" Windows (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()"
Благодаря Дж.Ф.Себастьянкомментарий автора.
Для обычных пакетных файлов в Windows NT + символ ^ скрывает множество вещей (<>|&), но для кавычек их удвоение творит чудеса:
C:\>perl -e "print localtime() . ""\n"""
Thu Oct 2 09:17:32 2008
Во-первых, любой ответ, который вы получите на этот вопрос, зависит от конкретной команды, потому что оболочка DOS не анализирует командную строку, как это делает uniq;он передает всю нераспределенную строку команде, которая выполняет любое разделение.Тем не менее, при использовании /subsystem:console среда выполнения C обеспечивает разделение перед вызовом main(), и большинство команд используют это.
Если приложение использует такое разделение, вы вводите буквальные двойные кавычки, удваивая их.Так бы вы поступили
perl -e "print localtime() . ""\n"""
В DOS вы используете "" вокруг своей команды Perl.Оболочка DOS не использует одинарные кавычки, как обычная оболочка Unix:
perl -e "print localtime();"