0

JRubyからDOSコマンドを実行するために、open3を使用してRubyでヘルパーメソッドを作成しました...

   def ShellUtils.execute_cmd(cmd)
        $ERRORS = ['Invalid type','Invalid path']
        out = nil
        err = nil
        Open3.popen3(cmd) {|stdin, stdout, stderr, wait_thr|
            out = stdout.read
            err = stderr.read
            unless err.nil?
                err = $ERRORS.detect {|e| err.include? e }
            end
            out.each {|line| logger.info "#{line}"} unless out.nil?
            err.each {|line| logger.error #{line}"} unless err.nil?

        }        
        return out, err
    end

実行中のプロセスの一部が無効な場合、その使用方法とともにエラー メッセージが出力されます。以下は、DOS でプロセスを実行したときの通常のエラー出力です。JRuby または Ruby は関係ありません...

C:\PROJECTS\bin>import.bat -su -types ws,v
Invalid type. Valid ones are: folder, datasource...
Usage:
  import -f path-to-file [-s servers-file | -h server...

しかし、JRubyimport.batを使用して実行するShellUtils.execute_cmd()と、ログにエラー メッセージが記録Invalid type. Valid ones are...されず、使用状況の出力がエラー ログに表示されるだけです。使用法とエラー メッセージが に由来するため、その理由がわかりませんimport.batoutとオブジェクトの両方をチェックしましたがerr、どちらにもエラー文字列が含まれていません。

プロセスの失敗を呼び出し元に通知するエラー メッセージを検出する必要があるだけですが、エラー ログにその文字列がないと、一体何が起こっているのかを知ることは困難です。

4

2 に答える 2

1

編集:

あなたの方法を少し見た後、私はあなたが間違っていると思います。これを試すことができますか:

def ShellUtils.execute_cmd(cmd)
  out = nil
  err = nil
  Open3.popen3(cmd) {|stdin, stdout, stderr, wait_thr|
    out = stdout.read
    err = stderr.read

    unless err.nil?
      err = err.split("\n")
      puts err.inspect
      err = err.select {|e| e =~ /Invalid/ }
    end

    out.each {|line| logger.info "#{line}"} unless out.nil?
    err.each {|line| logger.error "#{line}"} unless err.nil?

  }

  return out, err
end

思考ほど解決策ではありません。systemu を試してみてください。jrubyで私にとってはかなりうまくいきました:

require 'rubygems'
require 'systemu'

cmd = "#{File.expand_path('../', __FILE__)}/import.bat -su -types ws,v "

status, stdout, stderr = systemu cmd
p [ status, stdout, stderr ]
于 2012-04-19T19:40:01.563 に答える
0

その時点で、プロセスがまだエラー ストリームに書き込まれていない可能性があります。出力を読む前に、終了するのを待ってみてください。

Open3.popen3 cmd do |stdin, stdout, stderr, thread|
  thread.join  # Wait for the process to finish
  output, error = stdout.read, stderr.read
  # ...
end
于 2012-04-19T16:18:44.220 に答える