none
關機前執行VB.NET的執行檔 RRS feed

  • 問題

  • 我在網路上找到這篇文章

    Ramdisk資料回存(透過WinRAR)

    我想利用文章內自動備份RamDisk資料的方式,將我想保存的資料在關機前寫入硬碟

    在程式內我判斷今天是星期幾而將7天的資料分別存入7個資料夾

    我做了7個.Bat檔,利用Shell呼叫

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Me.Close()
            Shell("E:\RDFile\bat\Save\Save" & Today.DayOfWeek & ".bat", AppWinStyle.NormalFocus, True)
    End Sub

    Me.Close()只是不想將Form顯示而已,Shell是可以正常啟動的

    VB.NET編譯檔案名稱:RDSave.exe

    運用gpedit.msc設定關機前執行此RDSave.exe檔案

    但重開機執行結果都無法成功將檔案從RamDisk備份下來

    單獨執行.BAT檔可以成功備份,單獨執行RDSave.exe檔可以成功備份,關機前執行單一.Bat檔可以成功備份

    就是設定成關機前執行RDSave.exe無法備份

    請教前輩們,我應該怎麼做才能成功執行呢?


    2013年5月10日 下午 01:49

解答

  • 1. 你不能在 Form_Load 中呼叫 Me.Close ,你可以直接使用無視窗的模式處理,例如 Sub Main。

    2. 關機時,Windows 會對所有視窗送出 WM_CLOSE ,你的批次檔來不及執行吧... 還不如直接寫到你的程式裡。

    • 已標示為解答 GISK 2013年5月11日 上午 05:40
    2013年5月10日 下午 02:27
  • Hi,

    關機時OS是跑關機的流程~雖然你在關機命令中呼叫了這個程式

    但關機流程不一定能允許你的程式再開啟一個處理緒

    就算開起來了~它應該也不會確保新開的處理緒要正常跑完...

    因為你跟它講關機時要運行的是A程式~而A程式也確實開啟並結束了

    另外我不太懂你的問題~

    不是寫了7個bat檔,程式的動作也只是呼叫

    那...為甚麼要寫這個程式?!不是用bat檔處理或是直接新增關機指令集就好了?

    如果要開啟再關~又不會寫不要Form的...那為什麼不用Console應用程式的範本?


    謙卑學習,持之以恆,才能不斷的Level Up

    • 已標示為解答 GISK 2013年5月11日 上午 05:40
    2013年5月10日 下午 04:57

所有回覆

  • 1. 你不能在 Form_Load 中呼叫 Me.Close ,你可以直接使用無視窗的模式處理,例如 Sub Main。

    2. 關機時,Windows 會對所有視窗送出 WM_CLOSE ,你的批次檔來不及執行吧... 還不如直接寫到你的程式裡。

    • 已標示為解答 GISK 2013年5月11日 上午 05:40
    2013年5月10日 下午 02:27
  • Sub Main...?

    VB.NET我只會Form視窗程式Orz

    前輩是說用Class Project做Sub Main不要用Form Project?

    可我記得這樣建置出來不是.dll檔案嗎?

    我的批次檔會執行兩個動作,一個刪除舊檔案,另一個壓縮RamDisk資料並儲存入硬碟

    刪除舊檔案做了,但儲存沒做

    是因為壓縮還來不及完成就被Windows中斷掉了嗎

    但是我如果關機前呼叫的是批次檔,資料還是會成功保存,換成我的exe檔就不行呢?

    2013年5月10日 下午 02:45
  • Hi,

    關機時OS是跑關機的流程~雖然你在關機命令中呼叫了這個程式

    但關機流程不一定能允許你的程式再開啟一個處理緒

    就算開起來了~它應該也不會確保新開的處理緒要正常跑完...

    因為你跟它講關機時要運行的是A程式~而A程式也確實開啟並結束了

    另外我不太懂你的問題~

    不是寫了7個bat檔,程式的動作也只是呼叫

    那...為甚麼要寫這個程式?!不是用bat檔處理或是直接新增關機指令集就好了?

    如果要開啟再關~又不會寫不要Form的...那為什麼不用Console應用程式的範本?


    謙卑學習,持之以恆,才能不斷的Level Up

    • 已標示為解答 GISK 2013年5月11日 上午 05:40
    2013年5月10日 下午 04:57
  • 對吼,還有Console版本的可以用

    因為我想用程式判斷,7個批次檔是會將資料存放到7個不同資料夾

    依批次檔來備份7天的資料

    我不會寫批次檔判斷,所以想用VB.NET達成判斷再呼叫這些批次檔

    2013年5月11日 上午 02:21
  • 改成Console模式了

    目前就只能先依靠批次檔製作單一備份,再手動複製了

    感謝各位前輩的幫助

    我再找看看有沒有其他解決方法

    2013年5月11日 上午 05:40
  • 關於 Sub Main ...

    把你目前 WinForm 的程式,加入一個模組,裡面加入:

    Sub Main()

    ' 之後再剪貼

    End Sub

    選單 專案 屬性 應用程式 起始物件

    選擇 Sub Main

    等你把 Form_Load 的程式碼移到 Sub Main 中後,Form 就可以移除了。

    程式本身要特別處理 UnLoad / Close 事件,沒處理的話,收到 WM_CLOSE 就會直接關閉。

    2013年5月11日 上午 09:51
  • 謝謝心冷 前輩

    Sub Main模式已經更改完畢

    Close的話,我用步進模式去看,發現他只是關閉視窗,以下的程式碼還是會執行

    Dispose之後有程式碼才會出現例外事件

    所以我才會出現那樣的寫法

    2013年5月13日 上午 12:25
  • 又找到一篇文章

    Windows 關機前自動執行 CCleaner 清除隱私資料

    裡面適用環境有Win7

    他說可以開啟CCleaner,執行完畢才關機

    程式判斷status是否為0

    非0時系統延遲200毫秒

    雖然寫法是用VBScript

    下班回家後再試試看照著他的想法可不可以成功



    • 已編輯 GISK 2013年5月14日 上午 05:56 補上資料提供的寫法為VBS
    2013年5月14日 上午 05:54