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

时间:2016-01-29 21:57:58

标签: ruby batch-file polyglot

通常这对于“{3}}

中的”自调用“脚本非常有用

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

2 个答案:

答案 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透明的代码岛:

  1. @rem创建了一个ruby变量@rem,有时候是bat中的注释语句。该行被忽略,但允许在ruby文件中打开一个bat代码岛。
  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}}