Как использовать IO.popen для записи и чтения из дочернего процесса? - PullRequest
0 голосов
/ 25 мая 2010

Я запускаю net share из сценария ruby ​​для удаления общего сетевого ресурса Windows.

Если файлы в общем ресурсе используются, net share спросит пользователя, хотят ли они продолжить удаление, поэтому мой сценарий должен проверить вывод команды и вывести Y, если он обнаружит что net share просит его ввести.

Чтобы можно было записать процесс, я открываю его с флагами доступа "r+".

При попытке записи в процесс с помощью IO#puts появляется сообщение об ошибке:

Errno::EPIPE: Broken pipe

Что я здесь не так делаю? (Ошибка возникает на линии net_share.puts "Y")

(Текст вопроса, записанный net share, не сопровождается переводом строки, поэтому я использую IO#readpartial для чтения в выходных данных.)

def delete_network_share share_path

  command = "net share #{share_path} /DELETE"

  net_share = IO.popen(command, "r+")

  text = ""
  while true

    begin
      line = net_share.readpartial 1000 #read all the input that's available
    rescue EOFError
      break
    end

    text += line

    if text.scan("Do you want to continue this operation? (Y/N)").size > 0
      net_share.puts "Y"
      net_share.flush  #probably not needed?
    end
  end
  net_share.close
end

Ответы [ 3 ]

1 голос
/ 22 июня 2010

Если вы хотите, чтобы команда net share ... /delete всегда выполнялась успешно, вы можете передать флаг /y:

C:\>net share foo /delete /y
Users have open files on foo.  Continuing the operation will force the files closed.

foo was deleted successfully.
0 голосов
/ 26 мая 2010

попробуйте w + вместо r +

  Mode |  Meaning
  -----+--------------------------------------------------------
  "r"  |  Read-only, starts at beginning of file  (default mode).
  -----+--------------------------------------------------------
  "r+" |  Read-write, starts at beginning of file.
  -----+--------------------------------------------------------
  "w"  |  Write-only, truncates existing file
       |  to zero length or creates a new file for writing.
  -----+--------------------------------------------------------
  "w+" |  Read-write, truncates existing file to zero length
       |  or creates a new file for reading and writing.
  -----+--------------------------------------------------------
  "a"  |  Write-only, starts at end of file if file exists,
       |  otherwise creates a new file for writing.
  -----+--------------------------------------------------------
  "a+" |  Read-write, starts at end of file if file exists,
       |  otherwise creates a new file for reading and
       |  writing.
0 голосов
/ 25 мая 2010

Используйте net_share.readlines вместо начала / спасения / конца.

2-й результат для поиска в Google ruby io.popen.

...