Perl ワンライナーをバッチ ファイルにラップしたいと考えています。(簡単な) 例として、Unix シェルでは、次のようなコマンドを引用できます。
perl -e 'print localtime() . "\n"'
しかし、DOS は次の役立つエラー メッセージでそれを妨害します。
-e 行 1 の EOF の前のどこにも文字列ターミネータ "'" が見つかりません。
.bat ファイル内でこれを行う最善の方法は何ですか?
Perl ワンライナーをバッチ ファイルにラップしたいと考えています。(簡単な) 例として、Unix シェルでは、次のようなコマンドを引用できます。
perl -e 'print localtime() . "\n"'
しかし、DOS は次の役立つエラー メッセージでそれを妨害します。
-e 行 1 の EOF の前のどこにも文字列ターミネータ "'" が見つかりません。
.bat ファイル内でこれを行う最善の方法は何ですか?
Windows上のPerlのものについては、傾いた楊症候群にならないように、可能な限り一般化された引用符を使用するようにしています。DOSが必要とするものの引用符を保存します。
perl -e "print scalar localtime() . qq(\n)"
印刷の最後に改行が必要な場合は、-l
スイッチに次のように指示することができます。
perl -le "print scalar localtime()"
スイッチを使用して実行できるその他の優れた機能については、perlrunのドキュメントを参照してください。
Windowsの「DOSプロンプト」(cmd.exe)では、一重引用符ではなく二重引用符を使用する必要があります。引用されたPerlコードの内部では、Perlは多くのオプションを提供します。3つは:
perl -e "print localtime() . qq(\n)"
perl -e "print localtime() . $/"
perl -le "print ''.localtime()"
Perl 5.10以降を使用している場合:
perl -E "say scalar localtime()"
JFセバスティアンのコメントに感謝します。
Windows NT +での一般的なバッチファイルの場合、^文字は多くのことをエスケープします(<> |&)が、引用符の場合、それらを2倍にすると不思議になります。
C:\>perl -e "print localtime() . ""\n"""
Thu Oct 2 09:17:32 2008
まず、DOSシェルはuniqのようにコマンドラインを解析しないため、これに対する答えはコマンド固有です。解析されていない文字列全体をコマンドに渡します。コマンドは分割を行います。そうは言っても、/ subsystem:consoleを使用する場合、Cランタイムはmain()を呼び出す前に分割を提供し、ほとんどのコマンドはこれを使用します。
アプリケーションがこの分割を使用している場合、リテラルの二重引用符を入力する方法は、それを2倍にすることです。だからあなたはするだろう
perl -e "print localtime() . ""\n"""
DOSでは、Perlコマンドの前後に「」を使用します。DOSシェルは、通常のUnixシェルのように一重引用符を使用しません。
perl -e "print localtime();"