作者sicao (adios)
看板C_Sharp
标题[问题] 想同时执行并侦测多个命令提示试窗
时间Fri Oct 4 13:54:22 2019
目前的状况是这样的
假设有多个批次档(内容不能更改 与合并)
(以下为假设内容)
01.bat => cmd /k ping 0.0.0.1
02.bat => cmd /k ping 0.0.0.2
03.bat => cmd /k ping 0.0.0.3
......
还有个清单list.txt
里面记录着这些批次档位置(内容可以修改)
D:\bat\01.bat
D:\bat\02.bat
D:\bat\03.bat
这些批次档需"同时执行"且"执行完毕後视窗需保留"
当然很直觉的就写程式去读清单让它一行行跑
https://i.imgur.com/EguTp0l.png
也没问题
https://i.imgur.com/oP5J9uq.png
但现在为了要监看"每个视窗"的输出内容是否有错
增加了一些设定
https://i.imgur.com/aPm5x0w.png
结果画面就完全没显示讯息
https://i.imgur.com/VUiPu1b.png
请问我是哪做错
或需要做些啥修正 还是..??
谢谢
--
我还没说完呐~~ 够多了够多了,回家啦~!
\ /
○
︵ \○╱/|
. . ﹎ ﹍﹍ ╱ ̄﹚╱>
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.167.52.129 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1570168464.A.9FB.html
1F:→ kobe8112: 标准输出和标准错误资料流都重新定向後,要自己去接收 10/04 18:56
2F:→ kobe8112: 例如p.ErrorDataReceived += ....... 10/04 18:57
3F:→ kobe8112: p.OutputDataReceived += ..... 10/04 18:57
4F:→ sicao: 所以有办法在视窗看到画面吗 10/04 19:01
5F:→ sicao: 我需要原来的画面 10/04 19:54
6F:→ kobe8112: 输出流重导,你想显示想存档都是你可以自由控制的啊... 10/04 21:43
7F:→ kobe8112: 原本的画面是透过系统shell执行,各类讯息出现在预设的 10/04 21:43
8F:→ kobe8112: 标准输出,不就是你自己程式码说不要透过shell执行的吗? 10/04 21:44
9F:→ sicao: Process 物件必须将 UseShellExecute 属性设定为 false,才 10/05 08:20
10F:→ sicao: 能重新导向 IO 资料流 10/05 08:20
11F:→ sicao: UseShellExecute不等於false不行.. 10/05 08:21
12F:→ kobe8112: 所以我不是说了吗,导向以後你要去收,收到後你想干嘛都 10/05 08:32
13F:→ kobe8112: 可以啊 10/05 08:32
14F:→ sicao: 简单来说 我需要原画面 也需要标准输出与错误资料流的资料 10/05 09:10
15F:→ sicao: 而且导向後发现无法同时执行 会等一个执行完後再等下一个 10/05 10:24
16F:→ sicao: 本来想说放弃原画面 直接改用导向输出 但无法一次大量执 10/05 10:35
17F:→ sicao: 行就丧失了本来的意义.. 10/05 10:35
18F:→ kobe8112: 执行绪表示... 10/05 11:55
19F:→ sicao: 感谢您跟我耗..算是有点成果了 但没有原画面还是有遗憾 10/05 14:53
20F:→ kobe8112: 还是有点鬼打墙QQ 10/05 21:54
21F:→ kobe8112: 你的原画面就是系统shell,你已经刻意用程式码选择不透 10/05 21:54
22F:→ kobe8112: 过系统shell执行,并且重导资料流,那你该程序的各项输 10/05 21:55
23F:→ kobe8112: 出,就是写到缓冲区,你想做什麽,去缓冲区拿就好了, 10/05 21:55
24F:→ kobe8112: 建立个RichTextBox把各项输出写在这边也行,硬要再开一 10/05 21:57
25F:→ kobe8112: 个程序,把「前面自己从标准输出导向到缓冲区的资料流」 10/05 21:58
26F:→ kobe8112: 再导到这个程序的标准输出也没有不行啊...虽然有点脱裤 10/05 21:59
27F:→ kobe8112: 子放屁就是 10/05 21:59
28F:→ sicao: 是啊 就是不清楚要怎麽侦测系统shell的输出 怎麽查都只有 10/06 13:02
29F:→ sicao: 重新导向的范例 10/06 13:02
30F:→ sicao: 其实起因是手边有四十几个批次档 为了证明有执行 每个批 10/06 13:30
31F:→ sicao: 次档在执行完毕後要撷图证明(包含右下角主机时间) 同时执 10/06 13:30
32F:→ sicao: 行多个批次档比较省时间 所以就把所有批次档路径写在一清 10/06 13:30
33F:→ sicao: 单文字档 然後程式一行行读并执行 同时执行後分别撷图 10/06 13:30
34F:→ sicao: 这部份已经以程式处理了 但最近批次档有些会执行错误 需 10/06 13:30
35F:→ sicao: 重新执行那些未成功的批次档 本来是看撷图去看哪个批次档 10/06 13:30
36F:→ sicao: 失败(失败也要撷图 撷图直到成功执行为止) 但上次就漏看 10/06 13:30
37F:→ sicao: 了一个失败的没重新执行到 所以才想这方法 看能不能输出 10/06 13:30
38F:→ sicao: 执行失败的档案 让我直接读档再读取错误清单去重新执行这 10/06 13:30
39F:→ sicao: 些错误批次档 10/06 13:30
40F:→ kobe8112: 意思是重导的输出不能作为执行证明吗? 10/06 13:44
41F:→ ssccg: 重导进来之後,你手上就有那个输出,你再另外开一个视窗把 10/06 14:03
42F:→ ssccg: 输出印回去不就好了... 10/06 14:03
43F:→ ssccg: 不过最根本问题是截图证明有执行这个需求...截图哪看得出是 10/06 14:09
44F:→ ssccg: 不是真的是那支bat的输出 10/06 14:09
46F:→ ssccg: 大概是这样的概念,要有个视窗显示结果,不需要保留原视窗 10/06 15:28
47F:→ kobe8112: 我也是跟楼上大大有同样疑问所以问那句,很奇妙的证明QQ 10/06 16:22
48F:→ ssccg: 我是知道有单位会要求OP把执行结果截图啦...不过可以接受变 10/06 17:13
49F:→ ssccg: 更流程用一支新程式跑bat,难道不能接受截这支程式的输出画 10/06 17:14
50F:→ ssccg: 面就好,一定要截(看起来像)用cmd跑原bat的结果视窗? 10/06 17:15
51F:→ sicao: 因为图要修改相对於文字档难多了 尤其是整个桌面的图要改 10/06 18:44
52F:→ sicao: 很花时间 10/06 18:44
53F:→ sicao: 虽已经用另一程式跑批次了 但本质还是批次啊 在不修改登 10/06 18:49
54F:→ sicao: 录档的情况下 一次执行批次档最多就15个 用程式可以突破 10/06 18:49
55F:→ sicao: 这限制 省更多时间 10/06 18:49
56F:→ sicao: 另 图是看得出来是哪支批次的执行 因为上面内容不一样 10/06 20:26
57F:→ sicao: 真的有被这些图救过一次..之前被质疑不是程式没问题而是 10/06 20:28
58F:→ sicao: 我们根本没执行批次档更新 立马拿图出来打脸... 10/06 20:28
59F:→ kobe8112: 还是回到原点,如果这样的图可以作为证据, 10/06 21:49
60F:→ kobe8112: 那你就算是自己重导各个批次档的输出,无论是存成文字档 10/06 21:49
61F:→ kobe8112: 或是输出在RichTextBox什麽的控制项,一样可以做为纪录 10/06 21:50
62F:→ kobe8112: 啊? 因为听起来你目的并不是证据的可靠性要多高, 10/06 21:50
63F:→ kobe8112: 只是需要有个纪录,确认真的有执行这些程式而已, 10/06 21:51
64F:→ kobe8112: 还是不太明白,为什麽这样就不符合你的需求, 10/06 21:51
65F:→ kobe8112: 存成log一样可以加时间戳记以辅助之後的查询啊 10/06 21:52
66F:→ sicao: 就说啦..对方就是说文字容易修改 图才不易改 10/06 22:20
67F:→ sicao: 时间戳记要改也不难.. 10/06 22:20
68F:→ sicao: 後来是说服对方接受文字档 但同样要撷命令视窗正在执行的 10/06 22:22
69F:→ sicao: 图 即使是无内容的纯黑命令试窗也可以 因为视窗title 10/06 22:23
70F:→ sicao: 在执行批次时还是会依内容显示不同文字 10/06 22:24
71F:→ sicao: 简单来说 图不是我要的 输出文字是为了我自己方便而已 10/06 22:25
72F:→ sicao: 对方就是要图... 10/06 22:25
73F:→ ssccg: 图要修改难多了吗? 除非有另一支常驻程式会在桌面上随机显 10/06 23:07
74F:→ ssccg: 示一些东西(浮水印的概念),不然很直接就想到准备好一张背 10/06 23:07
75F:→ ssccg: 景图,把cmd视窗和系统时间挖掉,之後要几张假截图有几张.. 10/06 23:08
76F:→ ssccg: 不过重点是你有试过我上面贴的那个了吗? 执行结果重导到文 10/06 23:09
77F:→ ssccg: 字档,之後再把整个文字档重新印到cmd也不行? 10/06 23:10
78F:→ ssccg: 只是用bat写的简单POC,基本概念就是有了输出资料流,要假 10/06 23:17
79F:→ ssccg: 造另一个看起来像直接跑bat输出的视窗不难 10/06 23:18
80F:→ ssccg: 提到截图,如果真的不接受重导资料,一定要原来的视窗,既 10/06 23:20
81F:→ kobe8112: 为什麽我们这麽多代沟的感觉QQ 10/06 23:20
82F:→ ssccg: 然已有截图,也可以用OCR去抓图上的文字结果啊... 10/06 23:20
83F:→ kobe8112: 你原本的作法,那根本也不是「纯图」 10/06 23:21
84F:→ kobe8112: 只是一张「console上有文字」的图, 10/06 23:21
85F:→ kobe8112: 那跟「其他控制项上有文字」的截图,有证据力的差异吗? 10/06 23:22
86F:→ kobe8112: 如果你还是想跟我说「对方觉得有」,那就用我说的脱裤子 10/06 23:23
87F:→ kobe8112: 放屁法,也就是ssccg大说的方法,再开一个shell印出来 10/06 23:24
88F:→ sicao: 就说了 是上面的要求... 不然最原始的程式根本不会问世 10/06 23:25
89F:→ sicao: 四十几个要改图应该是不太容易啦 对我们来说 10/06 23:25
90F:→ kobe8112: 难改那是你所谓「上面」的意思,怎麽会是你的意思呢? 10/06 23:26
91F:→ kobe8112: 「图比文字难修改」,这句话简单来说是对的, 10/06 23:26
92F:→ kobe8112: 但你的情况是「图上的文字本来就可由你轻松控制输出」 10/06 23:27
93F:→ kobe8112: ,所以根本就还是同一件事罗XD 10/06 23:27
94F:→ sicao: 当初就是撷图太麻烦 要把每个命令视窗弄到最上层再撷 10/06 23:28
95F:→ kobe8112: 讨论了这麽多,对於你需求,重导到新的SHELL後截图即可 10/06 23:28
96F:→ sicao: 又怕有哪个视窗没撷到 才写出最初的程式 10/06 23:29
97F:→ sicao: 谢谢啦 导到新的SHELL上可能得再试试 因为昨天用正式 10/06 23:31
98F:→ sicao: 的几个批次档来测 感觉不是每个都顺利 有hang住的感觉 10/06 23:33
99F:→ sicao: 明天再来努力改进 10/06 23:33
100F:→ kobe8112: 喔喔,你不早说,截图的话不需要把视窗拉到上层啊 10/06 23:37
101F:→ kobe8112: windows api是好东西 10/06 23:37
103F:→ kobe8112: 视窗不是active或top都可以直接取得截图 10/06 23:38
104F:→ kobe8112: 取得视窗Hwnd的Windows api也有不只用标题名称的方式 10/06 23:39
105F:→ kobe8112: 可以直接列举出目前所有的,依关键字把所有要的都截一遍 10/06 23:39
106F:→ sicao: 因为要撷到桌面右下角的时间 所以我会把各视窗拉到最上层 10/07 07:17
107F:→ sicao: 这些动作都已经交给程式处理了 不然分别拉到最上层很烦的 10/07 07:17
108F:→ sicao: 又极可能会漏 10/07 07:17
110F:→ sicao: 包含右下角时间 10/07 08:08
111F:→ kobe8112: ...感觉你跟他们沟通真辛苦,想看系统时间明明cmd就可以 10/07 08:38
112F:→ kobe8112: 了,硬要人截图觉得比较难被修改,其实程式一样没几行就 10/07 08:38
113F:→ kobe8112: 轻松修改系统时间了,就证据力来说根本没差别QQ 10/07 08:39
114F:→ sicao: 现在有个问题 为何执行完 我关掉全黑命令视窗会被视为 10/07 09:47
115F:→ sicao: 中断?? 这样就变错误输出了... 有办法修正吗 10/07 09:47
116F:→ kobe8112: 你的process没有正确离开吧,你如果要把重导後的结果输 10/07 10:35
117F:→ kobe8112: 出在新的shell,那跑bat的process可以设定: 10/07 10:39
118F:→ kobe8112: p.StartInfo.CreateNoWindow=true; 10/07 10:39
119F:→ sicao: 现在不用输出到新shell了 10/07 11:36
120F:→ sicao: 现在问题是 怎知已经执行完毕等待输入 <= 好像这时关闭 10/07 11:36
121F:→ sicao: 就会被视为中断 有何方法得知process已经处理完毕 10/07 11:38
122F:→ sicao: 正在等待输入这情况呢 10/07 11:38
123F:→ kobe8112: 我建议执行时就带timeout参数进去,超时或接收到错误输 10/07 13:08
124F:→ kobe8112: 出视为异常结束 10/07 13:09
125F:→ sicao: timeout很不准...很吃网路状况 先抓title好了 10/07 13:47
126F:→ kobe8112: 不确定你有没有误会我意思,你的程式应该早就执行完了, 10/07 18:10
127F:→ kobe8112: 空在那就是单纯process没有离开 10/07 18:11
128F:→ kobe8112: 你可以参考: 10/07 18:11
131F:→ sicao: 我知道意思啊 但就如上所说 时间很不定 给个定值不适合 10/07 22:44
132F:→ kobe8112: 执行时间从数秒到数十分钟这麽大也没差啊,还是到小时? 10/07 23:18
133F:→ kobe8112: 一般性的时间不定...有差吗?你知道我意思的话, 10/07 23:19
134F:→ kobe8112: 这样回应感觉怪怪的,正常结束的程式,你自然会收到 10/07 23:20
135F:→ kobe8112: event不是? 10/07 23:20
136F:→ sicao: 但它执行完等待输入时 关闭就被视为异常结束 10/08 08:02
137F:→ sicao: 而且刚沟通完 改成这样图+文字输出可行 那我乾脆不用 10/08 08:07
138F:→ sicao: redirectoutput 直接用 > 输出就好...应该更简单 10/08 08:07
139F:→ kobe8112: 1.是怎麽判断执行完? 2.是怎麽关闭的? 10/08 08:57