Como faço para proteger citações em um arquivo de lote?
-
02-07-2019 - |
Pergunta
Eu quero embrulhar um Perl one-liner em um arquivo de lote . Para um exemplo (trivial), em um shell Unix, eu poderia citar-se um comando como este:
perl -e 'print localtime() . "\n"'
Mas bobinas DOS em que, com esta mensagem de erro útil:
Não é possível localizar terminator string """ em qualquer lugar antes EOF na linha -e 1.
Qual é a melhor maneira de fazer isso dentro de um .bat ?
Solução
Para coisas Perl no Windows, eu tento usar a citação generalizada, tanto quanto possível para que eu não fique inclinada síndrome palito. Eu salvar as cotações para o material que DOS necessita:
perl -e "print scalar localtime() . qq(\n)"
Se você só precisa de uma nova linha no final da impressão, você pode deixar o interruptor -l
fazer isso para você:
perl -le "print scalar localtime()"
Para outras coisas legais que você pode fazer com switches, consulte a documentação do perlrun .
Outras dicas
No Windows' prompt do DOS "(cmd.exe), você precisa usar aspas duplas não aspas simples. Por dentro do código Perl citado, Perl dá-lhe um monte de opções. Três são:
perl -e "print localtime() . qq(\n)"
perl -e "print localtime() . $/"
perl -le "print ''.localtime()"
Se você tem Perl 5.10 ou mais recente:
perl -E "say scalar localtime()"
Graças a J.F. comentário Sebastian 's.
Para arquivos gerais de lote no Windows NT +, o personagem ^ escapa muitas coisas (<> | &), mas para cotações, dobrando-los faz maravilhas:
C:\>perl -e "print localtime() . ""\n"""
Thu Oct 2 09:17:32 2008
Em primeiro lugar, qualquer resposta que você chegar a este é específico do comando, porque o shell DOS não analisa a linha de comando como um uniq faz; ele passa toda a cadeia não analisada ao comando, que não faz qualquer divisão. Dito isto, se usando / subsistema: consolar o tempo de execução C fornece divisão antes de chamar main (), ea maioria dos comandos usam este
.Se um aplicativo está usando essa divisão, a maneira que você digite um double-quote literal é dobrando-lo. Então você faria
perl -e "print localtime() . ""\n"""
Em DOS, você usa o "" em torno de seu comando Perl. é que o shell DOS não aspas simples como o shell normal Unix:
perl -e "print localtime();"