作者weakstudy (台灣高階管理人)
看板java
標題[問題]如何截取cmd的文字,轉存至文字檔?
時間Thu Jun 30 13:12:24 2016
如標題所問,
小弟有個"別人"寫好的程式碼,
執行它的時候,
它會自動叫起一個cmd來顯示執行過程及結果,
但因為cmd如果輸出太多的話,
前面的資訊就會被"吃"掉(或者說看不見),
所以想問說有沒有Java可以在這個cmd執行的時候,
可以把文字也轉存成txt呢?
或是有其他軟體做的到呢?
謝謝各位高手的賜教!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.164.180
※ 文章網址: https://www.ptt.cc/bbs/java/M.1467263547.A.315.html
推 omidofor: class Process 操作standard input 06/30 13:18
→ weakstudy: 可是那個自動叫起的cmd並不能下任何指令, 06/30 13:37
→ weakstudy: 這樣的話,要怎麼運用您的方法來操作呢?請賜教! 06/30 13:38
→ weakstudy: 也不能用cmd重新導向的方法 06/30 13:39
推 omidofor: 你的意思是你要對它下指令嗎?是的話用standard output 06/30 13:56
推 mars90226: 估狗Java pipe應該就有答案 06/30 14:06
→ weakstudy: 我的意思是…那個cmd視窗我完全不能控制… 06/30 14:08
→ weakstudy: 但是它會產生很多訊息,而訊息一多,前面的訊息就看 06/30 14:08
→ weakstudy: 不見,所以我想要把它的訊息"全部"存進文字檔, 06/30 14:09
→ weakstudy: 不知道做的到嗎? 06/30 14:09
→ cowbaying: 用log... 06/30 14:46
→ gameking: 你是要改別人寫好的程式碼還是要另外寫一個程式去做擷取 06/30 14:57
→ weakstudy: 另外寫一個程式去擷取 06/30 15:09
推 LaPass: 這樣喔.... 那就只能寫個鍵盤精靈之類的東西去擷取螢幕了 06/30 15:28
→ LaPass: 然後把螢幕上的字用影像識別去轉換成文字 06/30 15:29
→ LaPass: 或是你想辦法去修改那個自動跑起來的cmd,然後把輸出導到 06/30 15:29
→ LaPass: 純文字,如果是linux系統,就用 java xxxxxxx > log.txt 06/30 15:30
→ LaPass: 之類的。windows我不熟,但應該也有類似的方法 06/30 15:31
→ weakstudy: 就是因為那個cmd是它自已叫起來執行的,這才麻煩! 06/30 15:49
→ bitlife: 除非程式主動改導向,standard out file descriptor會繼承 06/30 20:47
→ bitlife: 所以在最上層的母程式做輸出導向,那個自動被叫的cmd的輸 06/30 20:48
→ bitlife: 出也會被導到最上層的輸出導向檔案去 06/30 20:48
→ weakstudy: 所以才想要用Java(或其他程式語言、軟體)擷取出cmd裡的 06/30 21:05
→ weakstudy: 文字 06/30 21:06
→ ripple0129: cmd可以調緩衝區大小 06/30 22:27
→ bitlife: 我和原po好像有點雞同鴨講.我這樣問,別人寫的程式(假設叫 06/30 22:47
→ bitlife: a.exe)最開始是怎麼被執行的? 06/30 22:47
→ bitlife: 假設a.exe是console程式,桌面有圖示,double click執行,就 06/30 22:49
→ bitlife: 產你描述的現象.如果我上面推測正確,你先開個cmd視窗,手 06/30 22:49
→ bitlife: 動執行 <path-to-a.exe>/a.exe > c:\out.txt 這樣就會達 06/30 22:50
→ bitlife: 成你希望把輸出轉到out.txt的目的了 06/30 22:50
→ bitlife: <path-to-a.exe>\a,exe 06/30 22:51
→ weakstudy: 回答大大 … double click後執行的是先跳出一個視窗, 07/01 13:56
→ weakstudy: 然後才又叫出cmd視窗,一共是叫出兩個視窗, 07/01 13:56
→ weakstudy: 所以小弟才不知道該怎麼處理第二個跳出的cmd視窗! 07/01 13:57
推 omidofor: 我又看了幾次原文,還是無法理解你想表達的是上面的意思 07/01 14:33
→ weakstudy: = =" 對不起,總之就是有辦法把cmd視窗裡顯示的文字, 07/01 15:28
→ weakstudy: 自動讀取後,寫入文字檔嗎? 07/01 15:29
→ weakstudy: 但不能使用轉導向的方法,有高手有任何方法嗎? 07/01 15:29
→ pico2k: 在win32平台,可以用API Hook的方法取得文字,請自行google 07/01 18:14
→ pico2k: google "win32 console hook" 07/01 18:14
→ bitlife: 你有照我說的,先開cmd,再下指令去執行 a.exe (對應到你的 07/01 23:52
→ bitlife: 第一個double click的執行檔)? 07/01 23:52
→ bitlife: 如果希望視窗本身也留下顯示,在*nix系統一般是pipe給tee 07/01 23:53
→ bitlife: 再寫到檔案 07/01 23:53
→ bitlife: 找win32版的tee理論上可以 07/01 23:53
→ iFEELing: 貌似那個a.exe會自己再CALL一個CMD起來跑 這樣PIPE有效? 07/02 11:36
→ bitlife: 正常會有效,因為file descriptor會一直被child process 07/02 13:29
→ bitlife: 繼承,只要child也是console程式,理論上ok的 07/02 13:30
→ bitlife: 當然如果程式有處理把child process的file descriptor轉 07/02 13:31
→ bitlife: 向,那就沒效了.反正試看看不吃虧 07/02 13:31
→ bitlife: 剛想了一下,會跳出新視窗這點有可能是不行,這代表control 07/02 13:34
→ bitlife: terminal(*nix術語)換了,標準輸出入就和最上代不同了 07/02 13:34
→ PttTime: window也可以 > 2>&1 07/02 20:06
→ cha122977: 直接轉存: xxx >> log.txt 07/03 13:27
→ cha122977: 顯示同時轉存: xxx | tee log.txt 07/03 13:27
→ weakstudy: 謝謝各位高手給的提示,小弟會試試! 07/04 09:31
→ weakstudy: 又來發問 … 這些方法好像都不行 ~"~ 07/04 20:45