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

看板C_Sharp (C#)作者 (adios)時間5年前 (2019/10/04 13:54), 編輯推噓0(00139)
留言139則, 3人參與, 5年前最新討論串1/1
目前的狀況是這樣的 假設有多個批次檔(內容不能更改 與合併) (以下為假設內容) 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://www.ptt.cc/bbs/C_Sharp/M.1570168464.A.9FB.html

10/04 18:56, 5年前 , 1F
標準輸出和標準錯誤資料流都重新定向後,要自己去接收
10/04 18:56, 1F

10/04 18:57, 5年前 , 2F
例如p.ErrorDataReceived += .......
10/04 18:57, 2F

10/04 18:57, 5年前 , 3F
p.OutputDataReceived += .....
10/04 18:57, 3F

10/04 19:01, 5年前 , 4F
所以有辦法在視窗看到畫面嗎
10/04 19:01, 4F

10/04 19:54, 5年前 , 5F
我需要原來的畫面
10/04 19:54, 5F

10/04 21:43, 5年前 , 6F
輸出流重導,你想顯示想存檔都是你可以自由控制的啊...
10/04 21:43, 6F

10/04 21:43, 5年前 , 7F
原本的畫面是透過系統shell執行,各類訊息出現在預設的
10/04 21:43, 7F

10/04 21:44, 5年前 , 8F
標準輸出,不就是你自己程式碼說不要透過shell執行的嗎?
10/04 21:44, 8F

10/05 08:20, 5年前 , 9F
Process 物件必須將 UseShellExecute 屬性設定為 false,才
10/05 08:20, 9F

10/05 08:20, 5年前 , 10F
能重新導向 IO 資料流
10/05 08:20, 10F

10/05 08:21, 5年前 , 11F
UseShellExecute不等於false不行..
10/05 08:21, 11F

10/05 08:32, 5年前 , 12F
所以我不是說了嗎,導向以後你要去收,收到後你想幹嘛都
10/05 08:32, 12F

10/05 08:32, 5年前 , 13F
可以啊
10/05 08:32, 13F

10/05 09:10, 5年前 , 14F
簡單來說 我需要原畫面 也需要標準輸出與錯誤資料流的資料
10/05 09:10, 14F

10/05 10:24, 5年前 , 15F
而且導向後發現無法同時執行 會等一個執行完後再等下一個
10/05 10:24, 15F

10/05 10:35, 5年前 , 16F
本來想說放棄原畫面 直接改用導向輸出 但無法一次大量執
10/05 10:35, 16F

10/05 10:35, 5年前 , 17F
行就喪失了本來的意義..
10/05 10:35, 17F

10/05 11:55, 5年前 , 18F
執行緒表示...
10/05 11:55, 18F

10/05 14:53, 5年前 , 19F
感謝您跟我耗..算是有點成果了 但沒有原畫面還是有遺憾
10/05 14:53, 19F

10/05 21:54, 5年前 , 20F
還是有點鬼打牆QQ
10/05 21:54, 20F

10/05 21:54, 5年前 , 21F
你的原畫面就是系統shell,你已經刻意用程式碼選擇不透
10/05 21:54, 21F

10/05 21:55, 5年前 , 22F
過系統shell執行,並且重導資料流,那你該程序的各項輸
10/05 21:55, 22F

10/05 21:55, 5年前 , 23F
出,就是寫到緩衝區,你想做什麼,去緩衝區拿就好了,
10/05 21:55, 23F

10/05 21:57, 5年前 , 24F
建立個RichTextBox把各項輸出寫在這邊也行,硬要再開一
10/05 21:57, 24F

10/05 21:58, 5年前 , 25F
個程序,把「前面自己從標準輸出導向到緩衝區的資料流」
10/05 21:58, 25F

10/05 21:59, 5年前 , 26F
再導到這個程序的標準輸出也沒有不行啊...雖然有點脫褲
10/05 21:59, 26F

10/05 21:59, 5年前 , 27F
子放屁就是
10/05 21:59, 27F

10/06 13:02, 5年前 , 28F
是啊 就是不清楚要怎麼偵測系統shell的輸出 怎麼查都只有
10/06 13:02, 28F

10/06 13:02, 5年前 , 29F
重新導向的範例
10/06 13:02, 29F

10/06 13:30, 5年前 , 30F
其實起因是手邊有四十幾個批次檔 為了證明有執行 每個批
10/06 13:30, 30F

10/06 13:30, 5年前 , 31F
次檔在執行完畢後要擷圖證明(包含右下角主機時間) 同時執
10/06 13:30, 31F

10/06 13:30, 5年前 , 32F
行多個批次檔比較省時間 所以就把所有批次檔路徑寫在一清
10/06 13:30, 32F

10/06 13:30, 5年前 , 33F
單文字檔 然後程式一行行讀並執行 同時執行後分別擷圖
10/06 13:30, 33F

10/06 13:30, 5年前 , 34F
這部份已經以程式處理了 但最近批次檔有些會執行錯誤 需
10/06 13:30, 34F

10/06 13:30, 5年前 , 35F
重新執行那些未成功的批次檔 本來是看擷圖去看哪個批次檔
10/06 13:30, 35F

10/06 13:30, 5年前 , 36F
失敗(失敗也要擷圖 擷圖直到成功執行為止) 但上次就漏看
10/06 13:30, 36F

10/06 13:30, 5年前 , 37F
了一個失敗的沒重新執行到 所以才想這方法 看能不能輸出
10/06 13:30, 37F

10/06 13:30, 5年前 , 38F
執行失敗的檔案 讓我直接讀檔再讀取錯誤清單去重新執行這
10/06 13:30, 38F

10/06 13:30, 5年前 , 39F
些錯誤批次檔
10/06 13:30, 39F
還有 60 則推文
10/06 23:37, 5年前 , 100F
喔喔,你不早說,截圖的話不需要把視窗拉到上層啊
10/06 23:37, 100F

10/06 23:37, 5年前 , 101F
windows api是好東西
10/06 23:37, 101F

10/06 23:38, 5年前 , 102F
10/06 23:38, 102F

10/06 23:38, 5年前 , 103F
視窗不是active或top都可以直接取得截圖
10/06 23:38, 103F

10/06 23:39, 5年前 , 104F
取得視窗Hwnd的Windows api也有不只用標題名稱的方式
10/06 23:39, 104F

10/06 23:39, 5年前 , 105F
可以直接列舉出目前所有的,依關鍵字把所有要的都截一遍
10/06 23:39, 105F

10/07 07:17, 5年前 , 106F
因為要擷到桌面右下角的時間 所以我會把各視窗拉到最上層
10/07 07:17, 106F

10/07 07:17, 5年前 , 107F
這些動作都已經交給程式處理了 不然分別拉到最上層很煩的
10/07 07:17, 107F

10/07 07:17, 5年前 , 108F
又極可能會漏
10/07 07:17, 108F

10/07 08:07, 5年前 , 109F
原本程式擷圖是這樣 https://i.imgur.com/zF7szYE.gif
10/07 08:07, 109F

10/07 08:08, 5年前 , 110F
包含右下角時間
10/07 08:08, 110F

10/07 08:38, 5年前 , 111F
...感覺你跟他們溝通真辛苦,想看系統時間明明cmd就可以
10/07 08:38, 111F

10/07 08:38, 5年前 , 112F
了,硬要人截圖覺得比較難被修改,其實程式一樣沒幾行就
10/07 08:38, 112F

10/07 08:39, 5年前 , 113F
輕鬆修改系統時間了,就證據力來說根本沒差別QQ
10/07 08:39, 113F

10/07 09:47, 5年前 , 114F
現在有個問題 為何執行完 我關掉全黑命令視窗會被視為
10/07 09:47, 114F

10/07 09:47, 5年前 , 115F
中斷?? 這樣就變錯誤輸出了... 有辦法修正嗎
10/07 09:47, 115F

10/07 10:35, 5年前 , 116F
你的process沒有正確離開吧,你如果要把重導後的結果輸
10/07 10:35, 116F

10/07 10:39, 5年前 , 117F
出在新的shell,那跑bat的process可以設定:
10/07 10:39, 117F

10/07 10:39, 5年前 , 118F
p.StartInfo.CreateNoWindow=true;
10/07 10:39, 118F

10/07 11:36, 5年前 , 119F
現在不用輸出到新shell了
10/07 11:36, 119F

10/07 11:36, 5年前 , 120F
現在問題是 怎知已經執行完畢等待輸入 <= 好像這時關閉
10/07 11:36, 120F

10/07 11:38, 5年前 , 121F
就會被視為中斷 有何方法得知process已經處理完畢
10/07 11:38, 121F

10/07 11:38, 5年前 , 122F
正在等待輸入這情況呢
10/07 11:38, 122F

10/07 13:08, 5年前 , 123F
我建議執行時就帶timeout參數進去,超時或接收到錯誤輸
10/07 13:08, 123F

10/07 13:09, 5年前 , 124F
出視為異常結束
10/07 13:09, 124F

10/07 13:47, 5年前 , 125F
timeout很不準...很吃網路狀況 先抓title好了
10/07 13:47, 125F

10/07 18:10, 5年前 , 126F
不確定你有沒有誤會我意思,你的程式應該早就執行完了,
10/07 18:10, 126F

10/07 18:11, 5年前 , 127F
空在那就是單純process沒有離開
10/07 18:11, 127F

10/07 18:11, 5年前 , 128F
你可以參考:
10/07 18:11, 128F

10/07 18:11, 5年前 , 129F

10/07 18:12, 5年前 , 130F

10/07 22:44, 5年前 , 131F
我知道意思啊 但就如上所說 時間很不定 給個定值不適合
10/07 22:44, 131F

10/07 23:18, 5年前 , 132F
執行時間從數秒到數十分鐘這麼大也沒差啊,還是到小時?
10/07 23:18, 132F

10/07 23:19, 5年前 , 133F
一般性的時間不定...有差嗎?你知道我意思的話,
10/07 23:19, 133F

10/07 23:20, 5年前 , 134F
這樣回應感覺怪怪的,正常結束的程式,你自然會收到
10/07 23:20, 134F

10/07 23:20, 5年前 , 135F
event不是?
10/07 23:20, 135F

10/08 08:02, 5年前 , 136F
但它執行完等待輸入時 關閉就被視為異常結束
10/08 08:02, 136F

10/08 08:07, 5年前 , 137F
而且剛溝通完 改成這樣圖+文字輸出可行 那我乾脆不用
10/08 08:07, 137F

10/08 08:07, 5年前 , 138F
redirectoutput 直接用 > 輸出就好...應該更簡單
10/08 08:07, 138F

10/08 08:57, 5年前 , 139F
1.是怎麼判斷執行完? 2.是怎麼關閉的?
10/08 08:57, 139F
文章代碼(AID): #1TbjwGdx (C_Sharp)
文章代碼(AID): #1TbjwGdx (C_Sharp)