[問題]如何截取cmd的文字,轉存至文字檔?

看板java作者 (台灣高階管理人)時間8年前 (2016/06/30 13:12), 編輯推噓5(5053)
留言58則, 12人參與, 最新討論串1/1
如標題所問, 小弟有個"別人"寫好的程式碼, 執行它的時候, 它會自動叫起一個cmd來顯示執行過程及結果, 但因為cmd如果輸出太多的話, 前面的資訊就會被"吃"掉(或者說看不見), 所以想問說有沒有Java可以在這個cmd執行的時候, 可以把文字也轉存成txt呢? 或是有其他軟體做的到呢? 謝謝各位高手的賜教! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.164.180 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1467263547.A.315.html

06/30 13:18, , 1F
class Process 操作standard input
06/30 13:18, 1F

06/30 13:37, , 2F
可是那個自動叫起的cmd並不能下任何指令,
06/30 13:37, 2F

06/30 13:38, , 3F
這樣的話,要怎麼運用您的方法來操作呢?請賜教!
06/30 13:38, 3F

06/30 13:39, , 4F
也不能用cmd重新導向的方法
06/30 13:39, 4F

06/30 13:56, , 5F
你的意思是你要對它下指令嗎?是的話用standard output
06/30 13:56, 5F

06/30 14:06, , 6F
估狗Java pipe應該就有答案
06/30 14:06, 6F

06/30 14:08, , 7F
我的意思是…那個cmd視窗我完全不能控制…
06/30 14:08, 7F

06/30 14:08, , 8F
但是它會產生很多訊息,而訊息一多,前面的訊息就看
06/30 14:08, 8F

06/30 14:09, , 9F
不見,所以我想要把它的訊息"全部"存進文字檔,
06/30 14:09, 9F

06/30 14:09, , 10F
不知道做的到嗎?
06/30 14:09, 10F

06/30 14:46, , 11F
用log...
06/30 14:46, 11F

06/30 14:57, , 12F
你是要改別人寫好的程式碼還是要另外寫一個程式去做擷取
06/30 14:57, 12F

06/30 15:09, , 13F
另外寫一個程式去擷取
06/30 15:09, 13F

06/30 15:28, , 14F
這樣喔.... 那就只能寫個鍵盤精靈之類的東西去擷取螢幕了
06/30 15:28, 14F

06/30 15:29, , 15F
然後把螢幕上的字用影像識別去轉換成文字
06/30 15:29, 15F

06/30 15:29, , 16F
或是你想辦法去修改那個自動跑起來的cmd,然後把輸出導到
06/30 15:29, 16F

06/30 15:30, , 17F
純文字,如果是linux系統,就用 java xxxxxxx > log.txt
06/30 15:30, 17F

06/30 15:31, , 18F
之類的。windows我不熟,但應該也有類似的方法
06/30 15:31, 18F

06/30 15:49, , 19F
就是因為那個cmd是它自已叫起來執行的,這才麻煩!
06/30 15:49, 19F

06/30 20:47, , 20F
除非程式主動改導向,standard out file descriptor會繼承
06/30 20:47, 20F

06/30 20:48, , 21F
所以在最上層的母程式做輸出導向,那個自動被叫的cmd的輸
06/30 20:48, 21F

06/30 20:48, , 22F
出也會被導到最上層的輸出導向檔案去
06/30 20:48, 22F

06/30 21:05, , 23F
所以才想要用Java(或其他程式語言、軟體)擷取出cmd裡的
06/30 21:05, 23F

06/30 21:06, , 24F
文字
06/30 21:06, 24F

06/30 22:27, , 25F
cmd可以調緩衝區大小
06/30 22:27, 25F

06/30 22:47, , 26F
我和原po好像有點雞同鴨講.我這樣問,別人寫的程式(假設叫
06/30 22:47, 26F

06/30 22:47, , 27F
a.exe)最開始是怎麼被執行的?
06/30 22:47, 27F

06/30 22:49, , 28F
假設a.exe是console程式,桌面有圖示,double click執行,就
06/30 22:49, 28F

06/30 22:49, , 29F
產你描述的現象.如果我上面推測正確,你先開個cmd視窗,手
06/30 22:49, 29F

06/30 22:50, , 30F
動執行 <path-to-a.exe>/a.exe > c:\out.txt 這樣就會達
06/30 22:50, 30F

06/30 22:50, , 31F
成你希望把輸出轉到out.txt的目的了
06/30 22:50, 31F

06/30 22:51, , 32F
   <path-to-a.exe>\a,exe
06/30 22:51, 32F

07/01 13:56, , 33F
回答大大 … double click後執行的是先跳出一個視窗,
07/01 13:56, 33F

07/01 13:56, , 34F
然後才又叫出cmd視窗,一共是叫出兩個視窗,
07/01 13:56, 34F

07/01 13:57, , 35F
所以小弟才不知道該怎麼處理第二個跳出的cmd視窗!
07/01 13:57, 35F

07/01 14:33, , 36F
我又看了幾次原文,還是無法理解你想表達的是上面的意思
07/01 14:33, 36F

07/01 15:28, , 37F
= =" 對不起,總之就是有辦法把cmd視窗裡顯示的文字,
07/01 15:28, 37F

07/01 15:29, , 38F
自動讀取後,寫入文字檔嗎?
07/01 15:29, 38F

07/01 15:29, , 39F
但不能使用轉導向的方法,有高手有任何方法嗎?
07/01 15:29, 39F

07/01 18:14, , 40F
在win32平台,可以用API Hook的方法取得文字,請自行google
07/01 18:14, 40F

07/01 18:14, , 41F
google "win32 console hook"
07/01 18:14, 41F

07/01 23:52, , 42F
你有照我說的,先開cmd,再下指令去執行 a.exe (對應到你的
07/01 23:52, 42F

07/01 23:52, , 43F
第一個double click的執行檔)?
07/01 23:52, 43F

07/01 23:53, , 44F
如果希望視窗本身也留下顯示,在*nix系統一般是pipe給tee
07/01 23:53, 44F

07/01 23:53, , 45F
再寫到檔案
07/01 23:53, 45F

07/01 23:53, , 46F
找win32版的tee理論上可以
07/01 23:53, 46F

07/02 11:36, , 47F
貌似那個a.exe會自己再CALL一個CMD起來跑 這樣PIPE有效?
07/02 11:36, 47F

07/02 13:29, , 48F
正常會有效,因為file descriptor會一直被child process
07/02 13:29, 48F

07/02 13:30, , 49F
繼承,只要child也是console程式,理論上ok的
07/02 13:30, 49F

07/02 13:31, , 50F
當然如果程式有處理把child process的file descriptor轉
07/02 13:31, 50F

07/02 13:31, , 51F
向,那就沒效了.反正試看看不吃虧
07/02 13:31, 51F

07/02 13:34, , 52F
剛想了一下,會跳出新視窗這點有可能是不行,這代表control
07/02 13:34, 52F

07/02 13:34, , 53F
terminal(*nix術語)換了,標準輸出入就和最上代不同了
07/02 13:34, 53F

07/02 20:06, , 54F
window也可以 > 2>&1
07/02 20:06, 54F

07/03 13:27, , 55F
直接轉存: xxx >> log.txt
07/03 13:27, 55F

07/03 13:27, , 56F
顯示同時轉存: xxx | tee log.txt
07/03 13:27, 56F

07/04 09:31, , 57F
謝謝各位高手給的提示,小弟會試試!
07/04 09:31, 57F

07/04 20:45, , 58F
又來發問 … 這些方法好像都不行 ~"~
07/04 20:45, 58F
文章代碼(AID): #1NTAexCL (java)
文章代碼(AID): #1NTAexCL (java)