Ruby 在不同进程中生成命令提示符,并在Windows上发送/接收命令

Ruby 在不同进程中生成命令提示符,并在Windows上发送/接收命令,ruby,Ruby,我手头有一个问题,需要我生成一个命令提示符作为一个不同的进程,并向它发送一些命令,然后捕获/解析命令输出。这种交互需要以父子进程的形式进行,比如说,所有命令都可以放在一个ruby文件中,在运行ruby文件时,命令被发送到控制台(命令提示符),从控制台接收输出并在ruby脚本中处理 我将遵循的一般逻辑是: 使用fork生成不同的进程并获取进程id 获取进程的流 写入进程的输入流并从输出流读取 我使用的环境是安装了Ruby 1.9.2的Windows XP机器。我下载了在上找到的win32进程库。通

我手头有一个问题,需要我生成一个命令提示符作为一个不同的进程,并向它发送一些命令,然后捕获/解析命令输出。这种交互需要以父子进程的形式进行,比如说,所有命令都可以放在一个ruby文件中,在运行ruby文件时,命令被发送到控制台(命令提示符),从控制台接收输出并在ruby脚本中处理

我将遵循的一般逻辑是:

  • 使用fork生成不同的进程并获取进程id
  • 获取进程的流
  • 写入进程的输入流并从输出流读取
  • 我使用的环境是安装了Ruby 1.9.2的Windows XP机器。我下载了在上找到的win32进程库。通过使用该库,我可以按如下方式执行步骤1

    require 'win32/process'
        APP_NAME = "C:\\Windows\\system32\\cmd.exe"
        process_info = Process.create(:app_name => APP_NAME,
          :creation_flags => Windows::Process::CREATE_NEW_CONSOLE,
          :process_inherit  => false,
          :thread_inherit   => true,
          :cwd => "C:\\"
        )
    
    由于win32进程库是基于在windows上使用进程和线程的,因此我尝试查看它的帮助。在阅读本文时,我发现可以使用GetStdHandle方法获取输入和输出流的句柄。但是,我在win32进程的任何地方都找不到实现此方法的方法

    有人能为我提供一些关于如何进行步骤2和3的指导吗

    还有,有没有其他方法可以用来解决手头的问题

    另外,我想了解更多关于进程间通信或进程的一般派生和分叉的信息,所以有人能告诉我一些好的参考资料吗


    提前感谢

    这里有一个在windows中使用IO.popen的示例,我想如果它与stdlib一起工作,就不要使用gems

    IO.popen("other_program", "w+") do |pipe|
      pipe.puts "here, have some input"
      pipe.close_write  # If other_program process doesn't flush its output, you probably need to use this to send an end-of-file, which tells other_program to give us its output. If you don't do this, the program may hang/block, because other_program is waiting for more input.
      output = pipe.read
    end
    
    # You can also use the return value from your block. (exit code stored in $? as usual)
    output = IO.popen("other_program", "w+") do |pipe|
      pipe.puts "here, have some input"
      pipe.close_write
      pipe.read
    end
    

    为什么不能使用
    system()
    或backticks来运行命令?我认为system()不会返回handleOk,那么
    IO.popen
    呢?示例:
    IO.popen('dir')。readlines
    。由于我不知道这种方法,所以没有尝试过这种方法。你会调查吗?我是否需要windows上的popen库,因为我在此页面上看到类似win32-open3的库
    IO。popen
    是std库的一部分,因此默认情况下它包含在windows上。我没有使用win32-open3的经验,但可能也值得一看。如果你想发现其他方法,请阅读这篇优秀的博客,感谢peter和Casper提供的链接和帮助