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

npo*_*aka 1 ruby polyglot batch-file

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

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

npo*_*aka 5

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

@break #^
=begin

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

=end
puts 'RUBY: Hello world!'
Run Code Online (Sandbox Code Playgroud)

输出将是:

BATCH:你好世界!

RUBY:你好世界!

这是解释.

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

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

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

  • Nitpick:`@ break`不会"声明"一个实例变量,它会*取消引用*它.由于它没有初始化,它将评估为"nil",无论如何都是无关紧要的,因为该值被忽略.实例变量不是在Ruby中声明的,它们是第一次分配时自动生成的. (3认同)