通常这对于“{3}}
中的”自调用“脚本非常有用嵌入代码的好脚本不应该使用丑陋的转义序列,没有临时文件和冗余输出。 是否可以使用Ruby?
答案 0 :(得分:5)
是的,有一些黑客攻击。这是一个例子(文件应该是.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并将以注释结束该行。在下一行,它将启动一个多行注释,其中将放置批处理代码。
另一方面,Cmd.exe将以静默方式执行break命令(因为如果是@符号)并且因为break命令不执行任何操作(它只是为了向后兼容而保留旧的dos命令),它将无效。 carret(它会批量转义特殊符号)将逃离新行,前两行将被取为一行。批处理部分完成后,我们可以关闭Ruby注释并放入代码。
Here可以看到批量嵌入代码的更多示例(Python,PHP等)。
答案 1 :(得分:3)
这是另一个hack,IMHO更容易理解,因为它不依赖于行继续,块级别注释和仅用于向后兼容的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}}