作者weakstudy (台湾高阶管理人)
看板java
标题[问题]如何截取cmd的文字,转存至文字档?
时间Thu Jun 30 13:12:24 2016
如标题所问,
小弟有个"别人"写好的程式码,
执行它的时候,
它会自动叫起一个cmd来显示执行过程及结果,
但因为cmd如果输出太多的话,
前面的资讯就会被"吃"掉(或者说看不见),
所以想问说有没有Java可以在这个cmd执行的时候,
可以把文字也转存成txt呢?
或是有其他软体做的到呢?
谢谢各位高手的赐教!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.170.164.180
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1467263547.A.315.html
1F:推 omidofor: class Process 操作standard input 06/30 13:18
2F:→ weakstudy: 可是那个自动叫起的cmd并不能下任何指令, 06/30 13:37
3F:→ weakstudy: 这样的话,要怎麽运用您的方法来操作呢?请赐教! 06/30 13:38
4F:→ weakstudy: 也不能用cmd重新导向的方法 06/30 13:39
5F:推 omidofor: 你的意思是你要对它下指令吗?是的话用standard output 06/30 13:56
6F:推 mars90226: 估狗Java pipe应该就有答案 06/30 14:06
7F:→ weakstudy: 我的意思是…那个cmd视窗我完全不能控制… 06/30 14:08
8F:→ weakstudy: 但是它会产生很多讯息,而讯息一多,前面的讯息就看 06/30 14:08
9F:→ weakstudy: 不见,所以我想要把它的讯息"全部"存进文字档, 06/30 14:09
10F:→ weakstudy: 不知道做的到吗? 06/30 14:09
11F:→ cowbaying: 用log... 06/30 14:46
12F:→ gameking: 你是要改别人写好的程式码还是要另外写一个程式去做撷取 06/30 14:57
13F:→ weakstudy: 另外写一个程式去撷取 06/30 15:09
14F:推 LaPass: 这样喔.... 那就只能写个键盘精灵之类的东西去撷取萤幕了 06/30 15:28
15F:→ LaPass: 然後把萤幕上的字用影像识别去转换成文字 06/30 15:29
16F:→ LaPass: 或是你想办法去修改那个自动跑起来的cmd,然後把输出导到 06/30 15:29
17F:→ LaPass: 纯文字,如果是linux系统,就用 java xxxxxxx > log.txt 06/30 15:30
18F:→ LaPass: 之类的。windows我不熟,但应该也有类似的方法 06/30 15:31
19F:→ weakstudy: 就是因为那个cmd是它自已叫起来执行的,这才麻烦! 06/30 15:49
20F:→ bitlife: 除非程式主动改导向,standard out file descriptor会继承 06/30 20:47
21F:→ bitlife: 所以在最上层的母程式做输出导向,那个自动被叫的cmd的输 06/30 20:48
22F:→ bitlife: 出也会被导到最上层的输出导向档案去 06/30 20:48
23F:→ weakstudy: 所以才想要用Java(或其他程式语言、软体)撷取出cmd里的 06/30 21:05
24F:→ weakstudy: 文字 06/30 21:06
25F:→ ripple0129: cmd可以调缓冲区大小 06/30 22:27
26F:→ bitlife: 我和原po好像有点鸡同鸭讲.我这样问,别人写的程式(假设叫 06/30 22:47
27F:→ bitlife: a.exe)最开始是怎麽被执行的? 06/30 22:47
28F:→ bitlife: 假设a.exe是console程式,桌面有图示,double click执行,就 06/30 22:49
29F:→ bitlife: 产你描述的现象.如果我上面推测正确,你先开个cmd视窗,手 06/30 22:49
30F:→ bitlife: 动执行 <path-to-a.exe>/a.exe > c:\out.txt 这样就会达 06/30 22:50
31F:→ bitlife: 成你希望把输出转到out.txt的目的了 06/30 22:50
32F:→ bitlife: <path-to-a.exe>\a,exe 06/30 22:51
33F:→ weakstudy: 回答大大 … double click後执行的是先跳出一个视窗, 07/01 13:56
34F:→ weakstudy: 然後才又叫出cmd视窗,一共是叫出两个视窗, 07/01 13:56
35F:→ weakstudy: 所以小弟才不知道该怎麽处理第二个跳出的cmd视窗! 07/01 13:57
36F:推 omidofor: 我又看了几次原文,还是无法理解你想表达的是上面的意思 07/01 14:33
37F:→ weakstudy: = =" 对不起,总之就是有办法把cmd视窗里显示的文字, 07/01 15:28
38F:→ weakstudy: 自动读取後,写入文字档吗? 07/01 15:29
39F:→ weakstudy: 但不能使用转导向的方法,有高手有任何方法吗? 07/01 15:29
40F:→ pico2k: 在win32平台,可以用API Hook的方法取得文字,请自行google 07/01 18:14
41F:→ pico2k: google "win32 console hook" 07/01 18:14
42F:→ bitlife: 你有照我说的,先开cmd,再下指令去执行 a.exe (对应到你的 07/01 23:52
43F:→ bitlife: 第一个double click的执行档)? 07/01 23:52
44F:→ bitlife: 如果希望视窗本身也留下显示,在*nix系统一般是pipe给tee 07/01 23:53
45F:→ bitlife: 再写到档案 07/01 23:53
46F:→ bitlife: 找win32版的tee理论上可以 07/01 23:53
47F:→ iFEELing: 貌似那个a.exe会自己再CALL一个CMD起来跑 这样PIPE有效? 07/02 11:36
48F:→ bitlife: 正常会有效,因为file descriptor会一直被child process 07/02 13:29
49F:→ bitlife: 继承,只要child也是console程式,理论上ok的 07/02 13:30
50F:→ bitlife: 当然如果程式有处理把child process的file descriptor转 07/02 13:31
51F:→ bitlife: 向,那就没效了.反正试看看不吃亏 07/02 13:31
52F:→ bitlife: 刚想了一下,会跳出新视窗这点有可能是不行,这代表control 07/02 13:34
53F:→ bitlife: terminal(*nix术语)换了,标准输出入就和最上代不同了 07/02 13:34
54F:→ PttTime: window也可以 > 2>&1 07/02 20:06
55F:→ cha122977: 直接转存: xxx >> log.txt 07/03 13:27
56F:→ cha122977: 显示同时转存: xxx | tee log.txt 07/03 13:27
57F:→ weakstudy: 谢谢各位高手给的提示,小弟会试试! 07/04 09:31
58F:→ weakstudy: 又来发问 … 这些方法好像都不行 ~"~ 07/04 20:45