Come posso proteggere le virgolette in un file batch?
-
02-07-2019 - |
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 ?
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();"