2013-03-20 4 views
0

Я использую один файл rb с rufus/scheduler на Windows. Скрипт выполняется при запуске comupter и запускается в CMD-окне.Как записывать все на экран в файл?

Как я могу регистрировать все, что Ruby выдает на экран, в файл? Я все еще хочу видеть выход на экране. Поэтому я хочу, чтобы журнал работал поверх текущего поведения.

  • для Windows 7 64 бит
  • рубин 1.9.3p194 (2012-04-20) [i386-mingw32]
+0

@Richard Brown: спасибо :-) – Radek

+0

ли хотите, чтобы написать как на экране, так и в файле, или просто на файл? – dbenhur

+0

Помог ли мой ответ вам? – dbenhur

ответ

3

Если вы просто хотите, чтобы скрипт для отправки вывода в файл вместо консоль использует IO#reopen для перенаправления stdout и stderr.

def redirect_console(filename) 
    $stdout.reopen(filename,'w') 
    $stderr.reopen(filename,'w') 
end 

redirect_console('/my/console/output/file') 

Если вам необходимо направить одного или более выходных потоков, использовать прокси-объект и method_missing послать им

class TeeIO 
    def initialize(*streams) 
    raise ArgumentError, "Can only tee to IO objects" unless streams.all? { |e| e.is_a? IO } 
    @streams = streams 
    end 

    def method_missing(meth, *args) 
    # HACK only returns result of first stream 
    @streams.map {|io| io.send(meth, *args) }.first 
    end 

    def respond_to_missing?(meth, include_all) 
    @streams.all? {|io| io.respond_to?(meth, include_all) } 
    end 
end 

def tee_console(filename) 
    tee_to = File.open(filename, 'w') 
    tee_to.sync = true # flush after each write 
    $stdout = TeeIO.new($stdout, tee_to) 
    $stderr = TeeIO.new($stderr, tee_to) 
end 

tee_console('/my/console/output/file') 
+0

Я хочу оба. Я хочу войти в консоль и посмотреть консоль. Это просто буфер консоли не достаточно большой. – Radek

+1

в unix вы могли бы '.reopen ('| tee # {filename}"') 'Я понятия не имею, есть ли у Windows стандартная утилита tee cmd. – dbenhur

+0

У меня не было времени ее протестировать (слишком занят на работе с новым релиз), но я буду.Также я комментирую/принимаю ваш ответ. Спасибо. – Radek

Смежные вопросы