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

Is it possible to embed a Ruby code into batch-file?

通常这对于“自调用”脚本很有用 notorious example

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

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

@break #^
=begin

@echo off
echo BATCH: Hello world!
ruby "%~f0" %*
exit /b 0

=end
puts 'RUBY: Hello world!'

输出将是:

BATCH: Hello world!

RUBY: Hello world!

这里是解释。

对于 Ruby @break #^ 将声明一个实例变量 break 并将以 comment.On 结束该行,下一行将开始一个多行注释,批处理代码将是放置.

另一方面,

Cmd.exe 将静默执行 break 命令(因为如果使用 @ 符号)并且因为 break 命令什么也不做(它和旧的 dos 命令仅用于向后兼容)它将没有effect.The 结尾的carret(它批量转义特殊符号)将转义新行,前两行将被占用。批处理部分完成后,我们可以关闭 Ruby 评论并放置代码。

Here 可以看到更多的批量嵌入代码示例(Python、PHP 等等)。

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

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

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

.

@rem = %Q{

@echo off
echo BATCH: Hello world!
ruby "%~f0" %*
exit /b %ERRORLEVEL%

}

# ruby code starts here

puts %Q{RUBY: Hello world! #{ARGV}}