我很难妥善逃避这个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? 谢谢!
这个特殊情况是很容易的,因为你根本不需要任何引用; 所有的特殊字符已经在引号内。 尝试:
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')) }^"
但是,根据上下文(即,整个命令本身是否被命令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')) }^^^"
另一个要问自己的问题是,你是否真的需要命令外壳。 在几乎所有的情况下,最简单的方法应该是完美的:
ruby -e "File.open('c:\replace_me', 'w') { |f| f.write(File.read('C:/Documents and Settings/All Users/Application Data/replace_me')) }"