2008-09-24 21 views
5

Quiero envolver un Perl one-liner en un archivo por lotes. Para un ejemplo (trivial), en una cáscara de Unix, podría citar un comando como este:¿Cómo protejo las comillas en un archivo por lotes?

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

Pero DOS ahoga en que con este mensaje de error útiles:

No se puede encontrar la cadena terminador "'" en cualquier lugar antes de EOF en -e línea 1.

¿Cuál es la mejor manera de hacer esto dentro de un .bat file?

Respuesta

13

Para las cosas de Perl en Windows, trato de usar las citas generalizadas tanto como sea posible para que no me incline por el síndrome del palillo de dientes. Puedo guardar las cotizaciones de las cosas que DOS necesita:

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

Si sólo necesita una nueva línea al final de la impresión, puede dejar que el interruptor -l hacer eso por usted:

perl -le "print scalar localtime()" 

Para otras cosas interesantes que puede hacer con los conmutadores, consulte la documentación perlrun.

+0

Los Lo bueno de esto es que también funciona en Linux. –

8

En el "prompt de DOS" de Windows (cmd.exe) necesita utilizar comillas dobles, no comillas simples. Para el interior del código de Perl citado, Perl te ofrece muchas opciones. Tres de ellos son:

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

Si tiene Perl 5.10 o más reciente:

perl -E "say scalar localtime()" 

Gracias a J.F. Sebastian 's comentario.

+0

buena respuesta, solo marginalmente menos buena que la que acepté. ¡Gracias! –

+0

perl -le "print localtime()" - imprime '2625625810842681' en lugar de 'Thu Sep 25 06:25:26 2008', perl -E "dice scalar localtime – jfs

+0

Esto también funciona [puede imprimir" Mar Ago 4 02: 54:07 2009 "]: perl -le" print escalar localtime() " –

1

En DOS, utiliza el "" alrededor de su comando Perl. El shell de DOS no hace comillas simples como la cáscara de Unix normales:

perl -e "print localtime();" 
1

primer lugar, cualquier respuesta que se obtiene de esto es al comando específico, debido a que el shell de DOS no analiza la línea de comandos como un uniq uno hace; pasa toda la cadena no procesada al comando, lo que hace cualquier división. Dicho esto, si usa/subsystem: console, el tiempo de ejecución de C proporciona división antes de llamar a main(), y la mayoría de los comandos lo usan.

Si una aplicación utiliza esta división, la forma en que escribe una comilla doble literal es doblándola. Por lo que haría

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

Para archivos por lotes generales en Windows NT +, el carácter^escapa un montón de cosas (<> | &), pero para las cotizaciones, la duplicación de ellos trabaja maravillas:

C:\>perl -e "print localtime() . ""\n""" 
Thu Oct 2 09:17:32 2008 
Cuestiones relacionadas