通常这对于像这个臭名昭著的例子中的“自调用”脚本很有用
嵌入代码的好脚本不应该使用丑陋的转义序列,没有临时文件和冗余输出。可以用 Ruby 完成吗?
通常这对于像这个臭名昭著的例子中的“自调用”脚本很有用
嵌入代码的好脚本不应该使用丑陋的转义序列,没有临时文件和冗余输出。可以用 Ruby 完成吗?
是的,有一些技巧。这是一个例子(文件应该带有.bat
扩展名):
@break #^
=begin
@echo off
echo BATCH: Hello world!
ruby "%~f0" %*
exit /b 0
=end
puts 'RUBY: Hello world!'
输出将是:
BATCH:世界你好!
鲁比:世界你好!
这是解释。
对于 Ruby @break #^
,将声明一个实例变量 break 并以注释结束该行。在下一行,它将开始一个多行注释,其中将放置批处理代码。
另一方面,Cmd.exe 将静默执行 break 命令(因为如果 @ 符号),并且因为 break 命令什么都不做(它和旧的 dos 命令仅用于向后兼容)它将没有任何效果。结尾的carret(它批量转义特殊符号)将转义新行,前两行将作为一行。批处理部分完成后,我们可以关闭 Ruby 注释并放置代码。
这里可以看到更多批量嵌入代码的示例(Python、PHP 等)。
这是另一个 hack,恕我直言,它更容易理解,因为它不依赖于行继续、块级注释和 CMD 语句,该语句仅用于向后兼容。
主要的是,bat 文件也必须是语法上有效的 ruby 文件。在这个 ruby 文件中,我们需要嵌入 CMD 语法。为此,我们需要创建一个对 ruby 透明的代码岛:
.
@rem = %Q{
@echo off
echo BATCH: Hello world!
ruby "%~f0" %*
exit /b %ERRORLEVEL%
}
# ruby code starts here
puts %Q{RUBY: Hello world! #{ARGV}}