電子書籍の厳選無料作品が豊富!

Ruby初心者です。

Rubyから違うファイルを実行する場合について教えてください。

例えば、test.batに
echo off
echo.

SET /p INPUT="Input string =>"
echo %INPUT%

pause
のように記述されており

これをRubyから実行し、
入力もRubyからするにはどうしたら良いでしょうか?

つまり、Rubyからtest.batを実行し、自動で入力も行いたいです。
echoの内容もコマンドプロンプトから確認したいです。


また、RubyからBuildコマンドを実行したいと思います。
Buildは別プロセスで動いている状態になっていると思いますが、
Build中はRubyはどのような状態になるでしょうか?

RubyからBuildした場合、Build動作が重くなることを懸念しています


有識者の方、よろしくお願いします。

A 回答 (3件)

test.batに文字を渡すだけなら



IO.popen("test.bat", "w") do |out|
out.puts "foobarbaz"
end


test.batの出力をRubyスクリプトで受け取るなら、こんな感じでどうでしょう。
require 'open3'
Open3.popen3("test.bat") do |stdin, stdout, stderr|
stderr.close
stdin.puts "foobarbaz"
stdin.close
while line = stdout.gets
puts "ruby : " + line
end
end

う~ん、pauseで停止しませんね。


> Buildは別プロセスで動いている状態になっていると思いますが、
> Build中はRubyはどのような状態になるでしょうか?

よくわかりませんが、Buildのプロセスの終了待ちではないでしょうか。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

上記実行してみましたが、
windows環境なので、open3が使用できませんでした。。。。

> う~ん、pauseで停止しませんね。
pauseで停止しなくても大丈夫です。
test.batを起動後、またrubyで別の処理を続けたいので。。

お礼日時:2010/08/08 15:47

No.1です。


私もWindows環境で使用しているので、そんなはずは……と思ったのですが
たしかに ActiveScriptRuby 1.8.7(p299)ではpopen3はエラーになりますね。

私が動作確認したのは以下です。
Ruby-1.9.1-p429 (RI抜き) Microsoft Installter Package(2010/07/021 version 28523)
http://www.artonx.org/data/asr/


# 先の回答にも書きましたが、test.batに文字を渡すだけならIO.popenで良いと思います。

一応、情報として追記させて頂きました。
    • good
    • 0

別解。



1)
SET /P で入力するのではなく、コマンドライン引数にして %1,%2...で参照する

2)
test.bat の内容をRubyに移植する。


> RubyからBuildコマンドを実行したい
その起動方法と処理次第でしょう。

exec()だと実行するコマンドに移行する形になるので、Runy自体が無くなります。
system()は呼び出したプロセスの終了を待つので、Ruby自体の処理はほとんどありません。
バッククオートも待ちますが、出力を文字列に蓄えるので、出力が大量だと影響があるかもしれません。
popen等だと、Ruby側の入出力処理(gets,puts等)が遅いと、ビルド側が待たされるかもしれません。
spawnで実行して、終了を待ち時間無しのループで確認するような作りにすると、このループが負荷になるかもしれません。
    • good
    • 0
この回答へのお礼

別回答ありがとうございます!!

> 1)
> SET /P で入力するのではなく、コマンドライン引数にして %1,%2...で参照する
> 2)
> test.bat の内容をRubyに移植する。
test.batの変更はせずに行いたいんですよね。。。
標準入力に対して自動的に入力できたら便利だなぁとおもって。

> exec()だと実行するコマンドに移行する形になるので、Runy自体が無くなります。
Build実行後、続けてのrubyの処理はできなくなるということでしょうか?

Build実行後、続けて処理するならば、
> system()は呼び出したプロセスの終了を待つので、Ruby自体の処理はほとんどありません。
がBuild時の余計な負荷は少なく、処理も続けてできそうでしょうか?

お礼日時:2010/08/08 15:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!