[問題] 想同時執行並偵測多個命令提示試窗

作者: 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