动态重定向在Windows

问题描述:

孩子的标准输出

我注意到有关处理这几个其他的问题,但似乎都患:动态重定向在Windows

  • 不工作在Windows
  • 要求孩子之前完成检索输出

我想要做的是调用一个程序(例如tshark.exe)并在运行时处理它的输出。

到目前为止我曾尝试:

  • 反引号
  • RUN3
  • PROC ::可靠

都没有成功。我可以花一整天的时间尝试,并且找不到一个能帮助我完成这个任务的模块(即我花了一整天的时间),但我认为如果我问是否有人知道这个模块可能会更好。

+1

确保目标程序正确地刷新其标准输出(并且实际上是将东西发送到标准输出)。可能有一些神奇的咒语来控制外面的缓冲,我不知道它可能是什么。如果tshark.exe做了一些有趣的事情,可能会感到困惑,并决定没有连接标准输出等。通过cmd.exe/k运行有什么影响? – 2010-09-07 22:47:33

+0

因为我没有编写目标程序,所以我没有很多控制权。我可以确认它正在写入STDOUT,并且在从cmd.exe运行时正在显示。我想在某些时候必须刷新输出,但我无法使用任何这些方法来显示它。 – tzenes 2010-09-07 22:49:46

你不需要一个模块。只需了解open命令的管道形式 - 这些在Windows上工作得很好。

my $pid = open (my $cmd_handle, "tshark.exe @options |"); 
# on success, $pid holds process identifier of the external command. 

while (<$cmd_handle>) { 
    # sets $_ to next line of output. 
    # Will block until a line of output is ready. 
    # Is undef when the command is complete. 

    ... process $_ ... 
} 
close $cmd_handle; # waits for command to complete if it hasn't completed yet 
+3

首选的“现代”咒语是'打开我的$句柄' - |',$ command'。使用管道时,我有时会在使用' - |'时以及何时使用'| -'时感到困惑。 – mob 2010-09-07 22:58:37

+0

你不知道你用这个答案减轻了多少压力。谢谢。 – tzenes 2010-09-07 23:15:03

+0

+1,但你应该检查'close'上的错误。 – 2010-09-08 02:21:50

结帐IPC::RunIPC::Open2IPC::Open3也可能会满足您的需求。

祝你好运!