[问题] 想同时执行并侦测多个命令提示试窗

楼主: sicao (adios)   2019-10-04 13:54:22
目前的状况是这样的
假设有多个批次档(内容不能更改 与合并)
(以下为假设内容)
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
请问我是哪做错
或需要做些啥修正 还是..??
谢谢
作者: kobe8112 (小B)   2019-10-04 18:56:00
标准输出和标准错误资料流都重新定向后,要自己去接收例如p.ErrorDataReceived += .......p.OutputDataReceived += .....
楼主: sicao (adios)   2019-10-04 19:01:00
所以有办法在视窗看到画面吗我需要原来的画面
作者: kobe8112 (小B)   2019-10-04 21:43:00
输出流重导,你想显示想存盘都是你可以自由控制的啊...原本的画面是透过系统shell执行,各类讯息出现在默认的标准输出,不就是你自己程式码说不要透过shell执行的吗?
楼主: sicao (adios)   2019-10-05 08:20:00
Process 物件必须将 UseShellExecute 属性设定为 false,才能重新导向 IO 资料流UseShellExecute不等于false不行..
作者: kobe8112 (小B)   2019-10-05 08:32:00
所以我不是说了吗,导向以后你要去收,收到后你想干嘛都可以啊
楼主: sicao (adios)   2019-10-05 09:10:00
简单来说 我需要原画面 也需要标准输出与错误资料流的资料而且导向后发现无法同时执行 会等一个执行完后再等下一个本来想说放弃原画面 直接改用导向输出 但无法一次大量执行就丧失了本来的意义..
作者: kobe8112 (小B)   2019-10-05 11:55:00
执行绪表示...
楼主: sicao (adios)   2019-10-05 14:53:00
感谢您跟我耗..算是有点成果了 但没有原画面还是有遗憾
作者: kobe8112 (小B)   2019-10-05 21:54:00
还是有点鬼打墙QQ你的原画面就是系统shell,你已经刻意用程式码选择不透过系统shell执行,并且重导资料流,那你该程序的各项输出,就是写到缓冲区,你想做什么,去缓冲区拿就好了,建立个RichTextBox把各项输出写在这边也行,硬要再开一个程序,把“前面自己从标准输出导向到缓冲区的资料流”再导到这个程序的标准输出也没有不行啊...虽然有点脱裤子放屁就是
楼主: sicao (adios)   2019-10-06 13:02:00
是啊 就是不清楚要怎么侦测系统shell的输出 怎么查都只有重新导向的范例其实起因是手边有四十几个批次档 为了证明有执行 每个批次档在执行完毕后要撷图证明(包含右下角主机时间) 同时执行多个批次档比较省时间 所以就把所有批次档路径写在一清单文字档 然后程式一行行读并执行 同时执行后分别撷图这部份已经以程式处理了 但最近批次档有些会执行错误 需重新执行那些未成功的批次档 本来是看撷图去看哪个批次档失败(失败也要撷图 撷图直到成功执行为止) 但上次就漏看了一个失败的没重新执行到 所以才想这方法 看能不能输出执行失败的档案 让我直接读档再读取错误清单去重新执行这些错误批次档
作者: kobe8112 (小B)   2019-10-06 13:44:00
意思是重导的输出不能作为执行证明吗?
作者: ssccg (23)   2019-10-06 14:03:00
重导进来之后,你手上就有那个输出,你再另外开一个视窗把输出印回去不就好了...不过最根本问题是截图证明有执行这个需求...截图哪看得出是不是真的是那支bat的输出https://paste.ofcode.org/QwZPcay9AdMeJDRScSpFU7大概是这样的概念,要有个视窗显示结果,不需要保留原视窗
作者: kobe8112 (小B)   2019-10-06 16:22:00
我也是跟楼上大大有同样疑问所以问那句,很奇妙的证明QQ
作者: ssccg (23)   2019-10-06 17:13:00
我是知道有单位会要求OP把执行结果截图啦...不过可以接受变更流程用一支新程式跑bat,难道不能接受截这支程式的输出画面就好,一定要截(看起来像)用cmd跑原bat的结果视窗?
楼主: sicao (adios)   2019-10-06 18:44:00
因为图要修改相对于文字档难多了 尤其是整个桌面的图要改很花时间虽已经用另一程式跑批次了 但本质还是批次啊 在不修改登录档的情况下 一次执行批次档最多就15个 用程式可以突破这限制 省更多时间另 图是看得出来是哪支批次的执行 因为上面内容不一样真的有被这些图救过一次..之前被质疑不是程式没问题而是我们根本没执行批次档更新 立马拿图出来打脸...
作者: kobe8112 (小B)   2019-10-06 21:49:00
还是回到原点,如果这样的图可以作为证据,那你就算是自己重导各个批次档的输出,无论是存成文字档或是输出在RichTextBox什么的控件,一样可以做为纪录啊? 因为听起来你目的并不是证据的可靠性要多高,只是需要有个纪录,确认真的有执行这些程式而已,还是不太明白,为什么这样就不符合你的需求,存成log一样可以加时间戳记以辅助之后的查询啊
楼主: sicao (adios)   2019-10-06 22:20:00
就说啦..对方就是说文字容易修改 图才不易改时间戳记要改也不难..后来是说服对方接受文字档 但同样要撷命令视窗正在执行的图 即使是无内容的纯黑命令试窗也可以 因为视窗title在执行批次时还是会依内容显示不同文字简单来说 图不是我要的 输出文字是为了我自己方便而已对方就是要图...
作者: ssccg (23)   2019-10-06 23:07:00
图要修改难多了吗? 除非有另一支常驻程式会在桌面上随机显示一些东西(浮水印的概念),不然很直接就想到准备好一张背景图,把cmd视窗和系统时间挖掉,之后要几张假截图有几张..不过重点是你有试过我上面贴的那个了吗? 执行结果重导到文字档,之后再把整个文字档重新印到cmd也不行?只是用bat写的简单POC,基本概念就是有了输出资料流,要假造另一个看起来像直接跑bat输出的视窗不难提到截图,如果真的不接受重导资料,一定要原来的视窗,既
作者: kobe8112 (小B)   2019-10-06 23:20:00
为什么我们这么多代沟的感觉QQ
作者: ssccg (23)   2019-10-06 23:20:00
然已有截图,也可以用OCR去抓图上的文字结果啊...
作者: kobe8112 (小B)   2019-10-06 23:21:00
你原本的作法,那根本也不是“纯图”只是一张“console上有文字”的图,那跟“其他控件上有文字”的截图,有证据力的差异吗?如果你还是想跟我说“对方觉得有”,那就用我说的脱裤子放屁法,也就是ssccg大说的方法,再开一个shell印出来
楼主: sicao (adios)   2019-10-06 23:25:00
就说了 是上面的要求... 不然最原始的程式根本不会问世四十几个要改图应该是不太容易啦 对我们来说
作者: kobe8112 (小B)   2019-10-06 23:26:00
难改那是你所谓“上面”的意思,怎么会是你的意思呢?“图比文字难修改”,这句话简单来说是对的,但你的情况是“图上的文字本来就可由你轻松控制输出”,所以根本就还是同一件事囉XD
楼主: sicao (adios)   2019-10-06 23:28:00
当初就是撷图太麻烦 要把每个命令视窗弄到最上层再撷
作者: kobe8112 (小B)   2019-10-06 23:28:00
讨论了这么多,对于你需求,重导到新的SHELL后截图即可
楼主: sicao (adios)   2019-10-06 23:29:00
又怕有哪个视窗没撷到 才写出最初的程式谢谢啦 导到新的SHELL上可能得再试试 因为昨天用正式的几个批次档来测 感觉不是每个都顺利 有hang住的感觉明天再来努力改进
作者: kobe8112 (小B)   2019-10-06 23:37:00
喔喔,你不早说,截图的话不需要把视窗拉到上层啊windows api是好东西例如这个: https://tinyurl.com/y6h3vhfc视窗不是active或top都可以直接取得截图取得视窗Hwnd的Windows api也有不只用标题名称的方式可以直接列举出目前所有的,依关键字把所有要的都截一遍
楼主: sicao (adios)   2019-10-07 07:17:00
因为要撷到桌面右下角的时间 所以我会把各视窗拉到最上层这些动作都已经交给程式处理了 不然分别拉到最上层很烦的又极可能会漏原本程式撷图是这样 https://i.imgur.com/zF7szYE.gif包含右下角时间
作者: kobe8112 (小B)   2019-10-07 08:38:00
...感觉你跟他们沟通真辛苦,想看系统时间明明cmd就可以了,硬要人截图觉得比较难被修改,其实程式一样没几行就轻松修改系统时间了,就证据力来说根本没差别QQ
楼主: sicao (adios)   2019-10-07 09:47:00
现在有个问题 为何执行完 我关掉全黑命令视窗会被视为中断?? 这样就变错误输出了... 有办法修正吗
作者: kobe8112 (小B)   2019-10-07 10:35:00
你的process没有正确离开吧,你如果要把重导后的结果输出在新的shell,那跑bat的process可以设定:p.StartInfo.CreateNoWindow=true;
楼主: sicao (adios)   2019-10-07 11:36:00
现在不用输出到新shell了现在问题是 怎知已经执行完毕等待输入 <= 好像这时关闭就会被视为中断 有何方法得知process已经处理完毕正在等待输入这情况呢
作者: kobe8112 (小B)   2019-10-07 13:08:00
我建议执行时就带timeout参数进去,超时或接收到错误输出视为异常结束
楼主: sicao (adios)   2019-10-07 13:47:00
timeout很不准...很吃网络状况 先抓title好了
作者: kobe8112 (小B)   2019-10-07 18:10:00
不确定你有没有误会我意思,你的程式应该早就执行完了,空在那就是单纯process没有离开你可以参考:https://tinyurl.com/y2clgf9qhttps://tinyurl.com/y67anzra
楼主: sicao (adios)   2019-10-07 22:44:00
我知道意思啊 但就如上所说 时间很不定 给个定值不适合
作者: kobe8112 (小B)   2019-10-07 23:18:00
执行时间从数秒到数十分钟这么大也没差啊,还是到小时?一般性的时间不定...有差吗?你知道我意思的话,这样回应感觉怪怪的,正常结束的程式,你自然会收到event不是?
楼主: sicao (adios)   2019-10-08 08:02:00
但它执行完等待输入时 关闭就被视为异常结束而且刚沟通完 改成这样图+文字输出可行 那我干脆不用redirectoutput 直接用 > 输出就好...应该更简单
作者: kobe8112 (小B)   2019-10-08 08:57:00
1.是怎么判断执行完? 2.是怎么关闭的?

Links booklink

Contact Us: admin [ a t ] ucptt.com