是否可以将Ruby代码嵌入到批处理文件中?

通常这对于像这个臭名昭着的例子中的 “自调用”脚本一样有用

嵌入代码的好脚本不应该使用丑陋的转义序列,没有临时文件和冗余输出。 可以用Ruby完成吗?

是的,有些hacks.Here是一个例子(文件应该是.bat扩展名):

 @break #^ =begin @echo off echo BATCH: Hello world! ruby "%~f0" %* exit /b 0 =end puts 'RUBY: Hello world!' 

输出将是:

BATCH:你好世界!

RUBY:你好世界!

这是解释。

对于Ruby @break #^将声明一个实例变量break并将以注释结束该行。在下一行,它将启动一个多行注释,其中将放置批处理代码。

另一方面,Cmd.exe将静默执行break命令(因为如果@符号)并且因为break命令什么也不做(它只是为了向后兼容而留下旧的dos命令)它将没有任何效果。结束carret(它将批处理中的特殊符号转义为将转义新行,前两行将被取为一行。 批处理部分完成后,我们可以关闭Ruby注释并放入代码。

这里可以看到批量嵌入代码的几个例子(Python,PHP等)。

这是另一个hack,IMHO更容易理解,因为它不依赖于行继续,块级别注释和仅用于向后兼容的CMD语句。

主要的是,bat文件也必须是一个语法上有效的ruby文件。 在这个ruby文件中,我们需要嵌入CMD语法。 为此,我们需要创建一个对ruby透明的代码岛:

  1. @rem创建了一个ruby变量@rem,有时候是bat中的注释语句。 该行被忽略,但允许在ruby文件中打开一个bat代码岛。
  2. exit / b 0终止command.com解析的部分

 @rem = %Q{ @echo off echo BATCH: Hello world! ruby "%~f0" %* exit /b %ERRORLEVEL% } # ruby code starts here puts %Q{RUBY: Hello world! #{ARGV}}