无法正确转义以下Windows命令

时间:2013-10-02 02:47:20

标签: ruby windows

我很难正确地逃避这个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的这个命令?谢谢!

1 个答案:

答案 0 :(得分: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')) }"

在更一般的情况下,您可能需要使用插入符来引用命令shell将解释的字符。我认为这是对的:

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')) }^"

但是,根据上下文(即,整个命令本身是否由命令shell解析),您可能需要双引号:

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')) }^^^"

要问自己的另一个问题是你是否真的需要命令shell。在几乎所有情况下,最简单的方法应该可以完美地运作:

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