Domanda

Voglio racchiudere un Perl one-liner in un file batch . Per un esempio (banale), in una shell Unix, potrei citare un comando come questo:

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

Ma DOS soffoca su questo con questo utile messaggio di errore:

  

Impossibile trovare il terminatore di stringa " '" ovunque prima di EOF alla -e linea 1.

Qual è il modo migliore per farlo all'interno di un .bat file ?

È stato utile?

Soluzione

Per roba Perl su Windows, provo a usare il più possibile le citazioni generalizzate in modo da non avere la sindrome dello stecchino pendente. Salvo le virgolette per le cose di cui DOS ha bisogno:

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

Se hai solo bisogno di una nuova riga alla fine della stampa, puoi lasciare che l'opzione -l lo faccia per te:

perl -le "print scalar localtime()"

Per altre cose interessanti che puoi fare con gli switch, consulta la perlrun .

Altri suggerimenti

In Windows " prompt DOS " (cmd.exe) è necessario utilizzare virgolette doppie non virgolette singole. All'interno del codice Perl citato, Perl ti offre molte opzioni. Tre sono:

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

Se hai Perl 5.10 o versioni successive:

perl -E "say scalar localtime()"

Grazie a J.F. Il commento di Sebastian .

Per i file batch generali in Windows NT +, il carattere ^ sfugge a molte cose (< > | & amp;), ma per le virgolette, raddoppiarle fa miracoli:

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

Per prima cosa, qualsiasi risposta a questa richiesta è specifica del comando, perché la shell DOS non analizza la riga di comando come fa uniq; passa l'intera stringa non analizzata al comando, che esegue qualsiasi divisione. Detto questo, se si utilizza / sottosistema: console il runtime C prevede la divisione prima di chiamare main (), e la maggior parte dei comandi lo utilizza.

Se un'applicazione utilizza questa suddivisione, il modo in cui si digita una doppia virgoletta letterale è raddoppiandola. Quindi lo faresti

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

In DOS, si usa il " " intorno al tuo comando Perl. La shell DOS non fa virgolette singole come la normale shell Unix:

perl -e "print localtime();"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top