1

この Windows コマンドを適切にエスケープするのに苦労しています。

cmd.exe -c "ruby -e "File.open('c:\replace_me', 'w') { |f| f.write(File.read('C:/Documents and Settings/All Users/Application Data/replace_me')) }""

以下のようなコマンドを実行すると、動作します。

ruby -e "File.open('c:\replace_me', 'w') { |f| f.write(File.read('C:/Documents and Settings/All Users/Application Data/replace_me')) }"

Windowsでこのコマンドを適切にエスケープする方法を教えてもらえますか? ありがとう!

4

1 に答える 1

1

この特定のケースは、引用符がまったく必要ないため、非常に簡単です。すべての特殊文字はすでに引用符で囲まれています。試す:

cmd /c ruby -e "File.open('c:\replace_me', 'w') { |f| f.write(File.read('C:/Documents and Settings/All Users/Application Data/replace_me')) }"

より一般的なケースでは、キャレットを使用して、コマンド シェルが解釈する文字を引用する必要がある場合があります。私はこれが正しいと思います:

cmd /c ruby -e ^"File.open('c:\replace_me', 'w') { ^|f^| f.write(File.read('C:/Documents and Settings/All Users/Application Data/replace_me')) }^"

ただし、コンテキスト (つまり、コマンド全体がコマンド シェルによって解析されているかどうか) によっては、次のように二重引用符で囲む必要がある場合があります。

cmd /c ruby -e ^^^"File.open('c:\replace_me', 'w') { ^^^|f^^^| f.write(File.read('C:/Documents and Settings/All Users/Application Data/replace_me')) }^^^"

自問すべきもう 1 つの質問は、実際にコマンド シェルが必要かどうかです。ほとんどすべてのコンテキストで、可能な限り単純なアプローチが完全に機能するはずです。

ruby -e "File.open('c:\replace_me', 'w') { |f| f.write(File.read('C:/Documents and Settings/All Users/Application Data/replace_me')) }"
于 2013-10-02T03:45:14.997 に答える