看板 C_Sharp 關於我們 聯絡資訊
目前的狀況是這樣的 假設有多個批次檔(內容不能更改 與合併) (以下為假設內容) 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
kobe8112: 標準輸出和標準錯誤資料流都重新定向後,要自己去接收 10/04 18:56
kobe8112: 例如p.ErrorDataReceived += ....... 10/04 18:57
kobe8112: p.OutputDataReceived += ..... 10/04 18:57
sicao: 所以有辦法在視窗看到畫面嗎 10/04 19:01
sicao: 我需要原來的畫面 10/04 19:54
kobe8112: 輸出流重導,你想顯示想存檔都是你可以自由控制的啊... 10/04 21:43
kobe8112: 原本的畫面是透過系統shell執行,各類訊息出現在預設的 10/04 21:43
kobe8112: 標準輸出,不就是你自己程式碼說不要透過shell執行的嗎? 10/04 21:44
sicao: Process 物件必須將 UseShellExecute 屬性設定為 false,才 10/05 08:20
sicao: 能重新導向 IO 資料流 10/05 08:20
sicao: UseShellExecute不等於false不行.. 10/05 08:21
kobe8112: 所以我不是說了嗎,導向以後你要去收,收到後你想幹嘛都 10/05 08:32
kobe8112: 可以啊 10/05 08:32
sicao: 簡單來說 我需要原畫面 也需要標準輸出與錯誤資料流的資料 10/05 09:10
sicao: 而且導向後發現無法同時執行 會等一個執行完後再等下一個 10/05 10:24
sicao: 本來想說放棄原畫面 直接改用導向輸出 但無法一次大量執 10/05 10:35
sicao: 行就喪失了本來的意義.. 10/05 10:35
kobe8112: 執行緒表示... 10/05 11:55
sicao: 感謝您跟我耗..算是有點成果了 但沒有原畫面還是有遺憾 10/05 14:53
kobe8112: 還是有點鬼打牆QQ 10/05 21:54
kobe8112: 你的原畫面就是系統shell,你已經刻意用程式碼選擇不透 10/05 21:54
kobe8112: 過系統shell執行,並且重導資料流,那你該程序的各項輸 10/05 21:55
kobe8112: 出,就是寫到緩衝區,你想做什麼,去緩衝區拿就好了, 10/05 21:55
kobe8112: 建立個RichTextBox把各項輸出寫在這邊也行,硬要再開一 10/05 21:57
kobe8112: 個程序,把「前面自己從標準輸出導向到緩衝區的資料流」 10/05 21:58
kobe8112: 再導到這個程序的標準輸出也沒有不行啊...雖然有點脫褲 10/05 21:59
kobe8112: 子放屁就是 10/05 21:59
sicao: 是啊 就是不清楚要怎麼偵測系統shell的輸出 怎麼查都只有 10/06 13:02
sicao: 重新導向的範例 10/06 13:02
sicao: 其實起因是手邊有四十幾個批次檔 為了證明有執行 每個批 10/06 13:30
sicao: 次檔在執行完畢後要擷圖證明(包含右下角主機時間) 同時執 10/06 13:30
sicao: 行多個批次檔比較省時間 所以就把所有批次檔路徑寫在一清 10/06 13:30
sicao: 單文字檔 然後程式一行行讀並執行 同時執行後分別擷圖 10/06 13:30
sicao: 這部份已經以程式處理了 但最近批次檔有些會執行錯誤 需 10/06 13:30
sicao: 重新執行那些未成功的批次檔 本來是看擷圖去看哪個批次檔 10/06 13:30
sicao: 失敗(失敗也要擷圖 擷圖直到成功執行為止) 但上次就漏看 10/06 13:30
sicao: 了一個失敗的沒重新執行到 所以才想這方法 看能不能輸出 10/06 13:30
sicao: 執行失敗的檔案 讓我直接讀檔再讀取錯誤清單去重新執行這 10/06 13:30
sicao: 些錯誤批次檔 10/06 13:30
kobe8112: 意思是重導的輸出不能作為執行證明嗎? 10/06 13:44
ssccg: 重導進來之後,你手上就有那個輸出,你再另外開一個視窗把 10/06 14:03
ssccg: 輸出印回去不就好了... 10/06 14:03
ssccg: 不過最根本問題是截圖證明有執行這個需求...截圖哪看得出是 10/06 14:09
ssccg: 不是真的是那支bat的輸出 10/06 14:09
ssccg: 大概是這樣的概念,要有個視窗顯示結果,不需要保留原視窗 10/06 15:28
kobe8112: 我也是跟樓上大大有同樣疑問所以問那句,很奇妙的證明QQ 10/06 16:22
ssccg: 我是知道有單位會要求OP把執行結果截圖啦...不過可以接受變 10/06 17:13
ssccg: 更流程用一支新程式跑bat,難道不能接受截這支程式的輸出畫 10/06 17:14
ssccg: 面就好,一定要截(看起來像)用cmd跑原bat的結果視窗? 10/06 17:15
sicao: 因為圖要修改相對於文字檔難多了 尤其是整個桌面的圖要改 10/06 18:44
sicao: 很花時間 10/06 18:44
sicao: 雖已經用另一程式跑批次了 但本質還是批次啊 在不修改登 10/06 18:49
sicao: 錄檔的情況下 一次執行批次檔最多就15個 用程式可以突破 10/06 18:49
sicao: 這限制 省更多時間 10/06 18:49
sicao: 另 圖是看得出來是哪支批次的執行 因為上面內容不一樣 10/06 20:26
sicao: 真的有被這些圖救過一次..之前被質疑不是程式沒問題而是 10/06 20:28
sicao: 我們根本沒執行批次檔更新 立馬拿圖出來打臉... 10/06 20:28
kobe8112: 還是回到原點,如果這樣的圖可以作為證據, 10/06 21:49
kobe8112: 那你就算是自己重導各個批次檔的輸出,無論是存成文字檔 10/06 21:49
kobe8112: 或是輸出在RichTextBox什麼的控制項,一樣可以做為紀錄 10/06 21:50
kobe8112: 啊? 因為聽起來你目的並不是證據的可靠性要多高, 10/06 21:50
kobe8112: 只是需要有個紀錄,確認真的有執行這些程式而已, 10/06 21:51
kobe8112: 還是不太明白,為什麼這樣就不符合你的需求, 10/06 21:51
kobe8112: 存成log一樣可以加時間戳記以輔助之後的查詢啊 10/06 21:52
sicao: 就說啦..對方就是說文字容易修改 圖才不易改 10/06 22:20
sicao: 時間戳記要改也不難.. 10/06 22:20
sicao: 後來是說服對方接受文字檔 但同樣要擷命令視窗正在執行的 10/06 22:22
sicao: 圖 即使是無內容的純黑命令試窗也可以 因為視窗title 10/06 22:23
sicao: 在執行批次時還是會依內容顯示不同文字 10/06 22:24
sicao: 簡單來說 圖不是我要的 輸出文字是為了我自己方便而已 10/06 22:25
sicao: 對方就是要圖... 10/06 22:25
ssccg: 圖要修改難多了嗎? 除非有另一支常駐程式會在桌面上隨機顯 10/06 23:07
ssccg: 示一些東西(浮水印的概念),不然很直接就想到準備好一張背 10/06 23:07
ssccg: 景圖,把cmd視窗和系統時間挖掉,之後要幾張假截圖有幾張.. 10/06 23:08
ssccg: 不過重點是你有試過我上面貼的那個了嗎? 執行結果重導到文 10/06 23:09
ssccg: 字檔,之後再把整個文字檔重新印到cmd也不行? 10/06 23:10
ssccg: 只是用bat寫的簡單POC,基本概念就是有了輸出資料流,要假 10/06 23:17
ssccg: 造另一個看起來像直接跑bat輸出的視窗不難 10/06 23:18
ssccg: 提到截圖,如果真的不接受重導資料,一定要原來的視窗,既 10/06 23:20
kobe8112: 為什麼我們這麼多代溝的感覺QQ 10/06 23:20
ssccg: 然已有截圖,也可以用OCR去抓圖上的文字結果啊... 10/06 23:20
kobe8112: 你原本的作法,那根本也不是「純圖」 10/06 23:21
kobe8112: 只是一張「console上有文字」的圖, 10/06 23:21
kobe8112: 那跟「其他控制項上有文字」的截圖,有證據力的差異嗎? 10/06 23:22
kobe8112: 如果你還是想跟我說「對方覺得有」,那就用我說的脫褲子 10/06 23:23
kobe8112: 放屁法,也就是ssccg大說的方法,再開一個shell印出來 10/06 23:24
sicao: 就說了 是上面的要求... 不然最原始的程式根本不會問世 10/06 23:25
sicao: 四十幾個要改圖應該是不太容易啦 對我們來說 10/06 23:25
kobe8112: 難改那是你所謂「上面」的意思,怎麼會是你的意思呢? 10/06 23:26
kobe8112: 「圖比文字難修改」,這句話簡單來說是對的, 10/06 23:26
kobe8112: 但你的情況是「圖上的文字本來就可由你輕鬆控制輸出」 10/06 23:27
kobe8112: ,所以根本就還是同一件事囉XD 10/06 23:27
sicao: 當初就是擷圖太麻煩 要把每個命令視窗弄到最上層再擷 10/06 23:28
kobe8112: 討論了這麼多,對於你需求,重導到新的SHELL後截圖即可 10/06 23:28
sicao: 又怕有哪個視窗沒擷到 才寫出最初的程式 10/06 23:29
sicao: 謝謝啦 導到新的SHELL上可能得再試試 因為昨天用正式 10/06 23:31
sicao: 的幾個批次檔來測 感覺不是每個都順利 有hang住的感覺 10/06 23:33
sicao: 明天再來努力改進 10/06 23:33
kobe8112: 喔喔,你不早說,截圖的話不需要把視窗拉到上層啊 10/06 23:37
kobe8112: windows api是好東西 10/06 23:37
kobe8112: 例如這個: https://tinyurl.com/y6h3vhfc 10/06 23:38
kobe8112: 視窗不是active或top都可以直接取得截圖 10/06 23:38
kobe8112: 取得視窗Hwnd的Windows api也有不只用標題名稱的方式 10/06 23:39
kobe8112: 可以直接列舉出目前所有的,依關鍵字把所有要的都截一遍 10/06 23:39
sicao: 因為要擷到桌面右下角的時間 所以我會把各視窗拉到最上層 10/07 07:17
sicao: 這些動作都已經交給程式處理了 不然分別拉到最上層很煩的 10/07 07:17
sicao: 又極可能會漏 10/07 07:17
sicao: 原本程式擷圖是這樣 https://i.imgur.com/zF7szYE.gif 10/07 08:07
sicao: 包含右下角時間 10/07 08:08
kobe8112: ...感覺你跟他們溝通真辛苦,想看系統時間明明cmd就可以 10/07 08:38
kobe8112: 了,硬要人截圖覺得比較難被修改,其實程式一樣沒幾行就 10/07 08:38
kobe8112: 輕鬆修改系統時間了,就證據力來說根本沒差別QQ 10/07 08:39
sicao: 現在有個問題 為何執行完 我關掉全黑命令視窗會被視為 10/07 09:47
sicao: 中斷?? 這樣就變錯誤輸出了... 有辦法修正嗎 10/07 09:47
kobe8112: 你的process沒有正確離開吧,你如果要把重導後的結果輸 10/07 10:35
kobe8112: 出在新的shell,那跑bat的process可以設定: 10/07 10:39
kobe8112: p.StartInfo.CreateNoWindow=true; 10/07 10:39
sicao: 現在不用輸出到新shell了 10/07 11:36
sicao: 現在問題是 怎知已經執行完畢等待輸入 <= 好像這時關閉 10/07 11:36
sicao: 就會被視為中斷 有何方法得知process已經處理完畢 10/07 11:38
sicao: 正在等待輸入這情況呢 10/07 11:38
kobe8112: 我建議執行時就帶timeout參數進去,超時或接收到錯誤輸 10/07 13:08
kobe8112: 出視為異常結束 10/07 13:09
sicao: timeout很不準...很吃網路狀況 先抓title好了 10/07 13:47
kobe8112: 不確定你有沒有誤會我意思,你的程式應該早就執行完了, 10/07 18:10
kobe8112: 空在那就是單純process沒有離開 10/07 18:11
kobe8112: 你可以參考: 10/07 18:11
kobe8112: https://tinyurl.com/y2clgf9q 10/07 18:11
kobe8112: https://tinyurl.com/y67anzra 10/07 18:12
sicao: 我知道意思啊 但就如上所說 時間很不定 給個定值不適合 10/07 22:44
kobe8112: 執行時間從數秒到數十分鐘這麼大也沒差啊,還是到小時? 10/07 23:18
kobe8112: 一般性的時間不定...有差嗎?你知道我意思的話, 10/07 23:19
kobe8112: 這樣回應感覺怪怪的,正常結束的程式,你自然會收到 10/07 23:20
kobe8112: event不是? 10/07 23:20
sicao: 但它執行完等待輸入時 關閉就被視為異常結束 10/08 08:02
sicao: 而且剛溝通完 改成這樣圖+文字輸出可行 那我乾脆不用 10/08 08:07
sicao: redirectoutput 直接用 > 輸出就好...應該更簡單 10/08 08:07
kobe8112: 1.是怎麼判斷執行完? 2.是怎麼關閉的? 10/08 08:57