2013-10-11 76 views
1

我正在尋找某些組織來獲取在Windows中的TCL腳本中執行的命令的輸出。情況是我有一個最終調用perl腳本的tcl腳本。事情是這樣的:將來自STDOUT和STDERR的消息分配給TCL變量

perl腳本結果輸出到標準輸出和標準錯誤:

#print message to STDOUT by default 
print "process A running ..."; 
... 
if ($fail) { 
    #print to STDERR 
    print STDERR "Process A failed."; 
} 

最初,所有我想從TCL腳本,看到的是從打印到STDERR消息,但現在我想看到兩者。有沒有辦法讓打印出來的消息到stdout被保存到一個tcl變量,並且從打印到stderr的消息被保存在另一個tcl變量中?這是我在TCL試圖得到這個工作:

puts "Running perl script ..." 
catch {[set stdout_var [exec perl C:/myScript.pl >@stdout]]} err_msg 
puts "\n\nerrmsg:\n$err_msg" 
puts "\n\nstdout:\n$stdout_var" 

這樣做,我得到的只是在ERR_MSG變量打印到STDERR消息(所以我走了一半),然而,stdout_var變量從未被設置爲任何東西。我希望它會設置爲STDOUT的消息,但事實並非如此。如果我刪除> @stdout,則stdout_var仍然不會被分配,err_msg包含打印到STDERR和STDOUT的所有消息。

感謝您的意見!

+0

重定向其中的一個臨時文件。 – potrzebie

回答

0

這裏有一個例子here on the Tcl wiki

puts "Running perl script ..." 

set pipe [open "| perl C:/myScript.pl"] 
set standard_output [read -nonewline $pipe] 
set exit_status 0 
if {[catch {close $pipe} standard_error] != 0} { 
    global errorCode 
    if {"CHILDSTATUS" == [lindex $errorCode 0]} { 
     set exit_status [lindex $errorCode 2] 
    } 
} 
puts "exit status: $exit_status" 
puts "\n\nstdout:\n$standard_output" 
puts "\n\nstderr:\n$standard_error" 
+0

有點複雜,我希望,但我試了一下。 $ standard_error僅包含錯誤消息,這很好。但是,$ stnadard_output包含stnadard輸出和標準錯誤消息。我想我可以處理這個變種多一些刪除它們,但我希望他們不會在那裏擺在首位。 – radensb

+0

我預計會工作。除非perl腳本被告知將錯誤吐出到兩個通道中;我已經知道把這些東西放在調試中,然後想知道以後的年代是什麼導致了它們(當它實際上是我自己的代碼時!)也許你也這樣做了? –

相關問題