バッチ ファイル内の引用符を保護するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/130698

  •  02-07-2019
  •  | 
  •  

質問

を包みたい 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()"

スイッチを使ってできるその他の優れた機能については、 パールラン ドキュメンテーション。

他のヒント

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()"

おかげで J.F.セバスチャンさんのコメント。

Windows NT+ の一般的なバッチ ファイルでは、^ 文字は多くのことをエスケープします (<>|&) が、引用符の場合は、それらを 2 倍にすると驚くほどうまくいきます。

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

まず、DOS シェルは UNIQ シェルのようにコマンドラインを解析しないため、これに対する答えはコマンド固有のものになります。解析されていない文字列全体がコマンドに渡され、分割が行われます。ただし、/subsystem:console を使用する場合、C ランタイムは main() を呼び出す前に分割を提供し、ほとんどのコマンドはこれを使用します。

アプリケーションがこの分割を使用している場合、リテラルの二重引用符を入力する方法は、二重引用符を二重にすることです。それであなたはそうするでしょう

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

DOS では、Perl コマンドを「」で囲みます。DOS シェルは、通常の Unix シェルのように一重引用符を使用しません。

perl -e "print localtime();"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top