四月 20

最近有個需求,就是固定時間內把某個資料夾內的檔案(不含子資料夾),壓縮成1個自解檔

而這個自解檔於執行時必需自動將檔案解壓到特定目錄,解壓完成後自動執行某個檔案

看起來似乎很複雜,不過事實上流程簡化後只有2個步驟

1.把檔案加入壓縮檔,並且引入解壓縮的參數
2.於 Windows 內的排程執行此指令

關於第2步驟 google 找一下就一堆教學了,在此不再贅述

第一步驟則是比較麻煩一點

首先,先建立一個檔案名為 config.txt 的文字檔,內容如下

Path=C:\Test_Dir
Title=測試自動解壓縮
Overwrite=1
Silent=2
Setup=setup.exe

這個檔為 WinRAR 要自動解壓縮時的參數檔

上面這些參數的意思代表

1.按下自解檔時,不詢問,自動執行解壓縮 (Silent=2)
2.要把檔案解壓縮到 C:\Test_Dir 這個目錄 (Path=C:\Test_Dir)
3.如果檔案存在就蓋過去 (Overwrite=1)
4.解壓縮完後自動執行 setup.exe (Setup=setup.exe)

接下來是使用指令模式來建立 WinRAR 的自解檔

先建立檔名為 run.bat 的批次檔,內容為

del "C:\out.exe"
path=%path%"C:\Program Files\WinRAR\";
winrar a -m2 -sfx -ibck -ep -zC:\config.txt "C:\out.exe" "C:\Target_Dir"

上面的意思表示

1.建立前先把舊的檔案刪除,如果沒刪除會一直累加進去壓縮檔 (del “C:\out.exe”)
2.把 Winrar 的路徑加入 Path 以便使用 (path=%path%”C:\Program Files\WinRAR\”;)
3.使用建立自動解壓縮檔的模式 (-sfx)
4.壓縮率設為一般 (-m2)
5.去掉檔案的完整路徑 (-ep)
6.於背景中壓縮檔案 (-ibck)
7.把解壓縮時的參數檔引入 (-zC:\config.txt)
8.壓縮檔完成時的存放位置 (“C:\out.exe”)
9.要壓縮的檔案位置 (“C:\Target_Dir”)

P.s 如果想要壓縮目標要包含子資料夾請加上一個參數 -r 就行了

接下來把 run.bat 放到 Windows 排程中執行就可以了

如果大家對參數檔有興趣,可以使用 WinRAR 的”參數產生器”來玩玩

先隨便找個檔案加入壓縮檔,接下來就看圖說故事

.

最後產生出來的參數會放在註解裡面

29 Responses to “WinRAR於指令模式自動化壓縮”

  1. judy Says:

    您好:
    不知有沒有什麼方式能自動掃瞄系統指定中的目錄並且解壓縮呢?
    thanks

  2. jason Says:

    順手寫了一個批次檔可以解決這個問題
    過幾天我再寫一篇詳細的文章,先把程式給你使用一下
    把下面存成 Unrar.bat,放到你要指定的目錄下,執行後就會解壓該目錄下所有的RAR檔

    @ECHO OFF
    REM AFTER_UNRAR_DELETE_FILE=YES 解壓後刪除原始的壓縮檔
    REM AFTER_UNRAR_DELETE_FILE=NO 解壓後保留原始的壓縮檔

    REM 在此設定要不要刪原始檔(大小寫有分別)
    SET AFTER_UNRAR_DELETE_FILE=NO
    REM 在此設定WINRAR的路徑
    SET WINRAR_PATH=C:\PROGRA~1\WinRAR\WinRAR.exe

    FOR %%F IN (*.rar) DO (
     ECHO “解壓 %%F…”
    MKDIR “Unrar_%%F”
    %WINRAR_PATH% x “%%F” * “Unrar_%%F”\
    IF %AFTER_UNRAR_DELETE_FILE%==YES (Del “%%F”)
    )

  3. 批次解壓縮檔案 | 電腦茶包 Blog Says:

    […] 延伸閱讀:WinRAR於指令模式自動化壓縮 […]

  4. 您好 Says:

    承jason 的問題,如果指定中的目錄含有分割的WINRAR壓縮檔(如PART1 PART2….等等)該怎麼辦?

    thanks

  5. jason Says:

    如果用上述的程式去跑,資料會被重覆的解出來,並放在各別的資料夾裡面
    xxx.part1.rar
    xxx.part2.rar
    xxx.part3.rar

    建議可以小修改一下程式
    只要去解 xxx.part1.rar 就可以了
    其他的分割檔Winrar會幫你搞定

    尋找
    FOR %%F IN (*.rar) DO (
    改成
    FOR %%F IN (*.part1.rar) DO (

  6. ritek Says:

    您好
    如果資料夾裡含有分割壓縮檔及一般壓縮檔的話要如何修改?
    還有如果壓縮檔裡還有一個壓縮檔的話要如何一併解壓縮
    謝謝

  7. jason Says:

    第一層解壓完後
    把批次檔copy一份到第二層裡面去
    在第二層裡執行批次檔

    如有第三、四…..層的話,以此類推

  8. ritek Says:

    您好
    那如果一個資料夾裡有分割壓縮檔(xxx.part1 xxx.part2)及一般的壓縮檔(.rar)
    用上述的改法只能解出分割壓縮檔,有辦法2種都解出來嗎?
    謝謝

  9. jason Says:

    以目前陽春的bat是無法做到你所說的功能
    不過有個取巧的做法,你可以參考看看

    把可解正常RAR的批次檔,存成a.bat
    把可解分割RAR的批次檔,存成b.bat

    新增一個all.bat,去呼叫a.bat與b.bat
    或是把a.bat與b.bat的內容寫一起寫進all.bat也可以

    這樣就可以通吃了

  10. Says:

    是否有辦法在解壓縮完畢之後刪除主體@@?

    我使用 Delete=%USERPROFILE%\桌面\壓縮檔案名稱

    貌似不行呢@@ˇ

  11. jason Says:

    把下面的文字存成 a.bat ,放到壓縮檔的位置執行
    就可以自動解壓該資料夾下的所有 *.rar,解壓完會自動刪除壓縮檔

    REM 在此設定要不要刪原始檔(大小寫有分別)
    SET AFTER_UNRAR_DELETE_FILE=YES
    REM 在此設定WINRAR的路徑
    SET WINRAR_PATH=C:\PROGRA~1\WinRAR\WinRAR.exe

    FOR %%F IN (*.rar) DO (
     ECHO “解壓 %%F…”
    MKDIR “Unrar_%%F”
    %WINRAR_PATH% x “%%F” * “Unrar_%%F”\
    IF %AFTER_UNRAR_DELETE_FILE%==YES (Del “%%F”)
    )

  12. JEREMY Says:

    如何在自動解壓到a資料夾前~先刪除a資料夾裡面的所有東西呢?

  13. jason Says:

    to JEREMY:
    可以配合RD指令使用,以下說明供參考

    Microsoft Windows [版本 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. All rights reserved.

    C:\Users\xxx>rd /?
    移除 (刪除) 一個目錄。

    RMDIR [/S] [/Q] [drive:]path
    RD [/S] [/Q] [drive:]path

    /S 除了目錄本身之外,一併移除指定目錄裡的所有目錄和檔案。
    用於移除樹狀目錄結構。

    /Q 安靜模式,有 /S 時,刪除目錄樹結構不再要求確認

  14. JEREMY Says:

    TO JASON:
    RD這指令如果要加在rar註解中可行嗎?
    謝謝解答

  15. jason Says:

    to JEREMY:
    應該是不行把RD加在rar的註解中。
    不過你可以考慮寫一個bat檔,把要作的事與流程寫在裡面,
    然後把這個bat設成預設會執行的程式就可以了

  16. 九尾狐 Says:

    請問自解檔如何才能在自解後再自我刪除?
    我試過在進階功能加入自解檔名在刪除部份, 但無法刪除
    又試過加入bat檔, 在解壓縮後執行該bat檔, 但bat檔刪除得到而自解檔本身依然存在, 不經自解檔執行該bat檔又能夠刪除沒問題….

    到底該如何寫才能自解完後再自刪?

  17. jason Says:

    to 九尾狐:

    我有做了一下實驗,的確會有你說的這情形。
    追一下下原因,結果發現是,在刪除的那一瞬間,自解檔exe還在執行,所以刪不掉。
    你也可以自己做實驗,在bat的刪除指令的下一行下個pause指命你就懂了。
    例:
    del /q test.exe
    pause

    要解決這個問題最簡單的方法就是讓刪除的指令delay一下再執行,這樣就可以了。
    delay的方式可以參考下面的指令,下面的指令表示暫停3秒後再執行,如果你只想暫停一秒那就改成@ping 127.0.0.1 -n 1 -w 1000 > nul

    @ping 127.0.0.1 -n 3 -w 1000 > nul
    del /q test.exe

  18. 無知 Says:

    用您說的WinRAR 的”參數產生器”來自解壓縮檔出現
    1.都會先RUN Setup=C:\ABW\456.exe 才RUN Setup=C:\ABW\123.exe
    2.安裝完後檔也不會刪除
    麻煩您指導一下,謝謝

    Path=C:\
    SavePath
    Silent=2
    Setup=C:\ABW\123.exe
    Setup=C:\ABW\456.exe
    Delete=C:\ABW\456.exe
    Delete=C:\ABW\123.exe

  19. jason Says:

    to 無知:
    Setup只要設定一行即可,不需要設定2行,如果有要執行多個程式,可以寫成bat檔,然後Setup設定為執行該bat檔即可。

    安裝後要自行刪除的部份,可以參考第17樓的留言。

  20. 無知 Says:

    jason~
    您指的是說,我寫bat放在”解壓後執行”的欄位,讓bat去執行setup及delete的動作,是嗎?我馬上來試試。
    謝謝您不吝指教,謝謝。

  21. 無知 Says:

    to jason:
    Path=C:\
    start C:\AbW\123.exe
    start C:\AbW\456.exe
    del /q C:\AbW\123.exe
    del /q C:\AbWhiz\456.exe
    pause
    exit
    我將這命令設為bat後,會出現只執行123.exe 但456.exe就跳過沒執行,但刪除123.exe及456.exe都成功。
    若改成
    Path=C:\
    start C:\AbW\123.exe
    pause
    start C:\AbW\456.exe
    del /q C:\AbW\123.exe
    del /q C:\AbWhiz\456.exe
    pause
    exit
    會出現執行123.exe (按任意鍵)會再執行456.exe,但刪除456.exe會出現存取被拒,可以再指點一下嗎?
    C:\>Path=C:\
    C:\>start C:\AbW\123.exe
    C:\>pause
    請按任意鍵繼續 . . .
    C:\>start C:\AbW\456.exe
    C:\>del /q C:\AbW\123.exe
    C:\>del /q C:\AbW\456.exe
    C:\AbW\456.exe
    存取被拒。
    C:\>pause
    請按任意鍵繼續 . . .

  22. jason Says:

    to 無知:

    刪除時需注意檔案使用中被鎖定的問題,
    解法是刪除前,先暫停一小段時間,
    暫停的方法可參考第留言的第17篇

    @ping 127.0.0.1 -n 3 -w 1000 > nul

    上方的指令是暫停1秒,如要暫停3秒就使用下面的指令

    @ping 127.0.0.1 -n 3 -w 3000 > nul

    但如果你的123.exe有使用到456.exe,那你就要自己想辦法解決了。

  23. 無知 Says:

    to: jason
    好的,謝謝。

  24. 無知 Says:

    to: jason
    將程式改成如下:
    Path=C:\
    start C:\AbW\123.exe
    @ping 127.0.0.1 -n 3 -w 10000 > nul
    pause
    start C:\AbW\456.exe
    @ping 127.0.0.1 -n 3 -w 10000 > nul
    pause
    del /q C:\AbW\123.exe
    del /q C:\AbW\456.exe
    @ping 127.0.0.1 -n 3 -w 10000 > nul
    exit
    已經達到我的目地,我完全沒碰過DOS的說,非常謝謝您的指點。

  25. BiBol Says:

    請問如果是分割的壓縮檔要如何全部刪除呢?
    因為採用%%F in (*.part1.rar) 只刪除了*.part1.rar的檔案
    *.part2.rar…….. *.part7.rar就還是會留著

    REM 在此設定要不要刪原始檔(大小寫有分別)
    SET AFTER_UNRAR_DELETE_FILE=YES
    REM 在此設定WINRAR的路徑
    SET WINRAR_PATH=C:\PROGRA~1\WinRAR\WinRAR.exe

    FOR %%F IN (*.part1.rar) DO (
     ECHO “解壓 %%F…”
    MKDIR “Unrar_%%F”
    %WINRAR_PATH% x “%%F” * “Unrar_%%F”\
    IF %AFTER_UNRAR_DELETE_FILE%==YES (Del “%%F”)
    )

  26. jason Says:

    to BiBol:

    如果有分割檔的話,我建議是解壓完成後,再一次刪除。
    例如下面的範例,可以試試看

    FOR %%F IN (*.part1.rar) DO (
     ECHO “解壓 %%F…”
    MKDIR “Unrar_%%F”
    %WINRAR_PATH% x “%%F” * “Unrar_%%F”\
    )

    IF %AFTER_UNRAR_DELETE_FILE%==YES (Del “*.part*.rar”)

  27. ktl Says:

    感謝大大的教學,受益良多
    另外想請問有沒有辦法將不同資料夾中的壓縮檔解壓縮到個別資料夾?

    舉例:
    C:\1\AAA.rar 解壓縮到 C:\1\
    C:\2\BBB.rar 解壓縮到 C:\2\
    C:\3\CCC.rar 解壓縮到 C:\3\

    這樣子 謝謝

  28. jason Says:

    to ktl:

    建議可以使用批次檔,配合winrar的console指令,這樣該可以達成你想要的效果。

  29. 新手 Says:

    大大想問你如果想做成把檔案解壓縮到當前目錄怎麼寫呢?
    類似像A(a.rar B(b.rar) C(c.rar D(d.rar))) 這樣子的架構
    解釋起來就是A裡面有a.rar B目錄 C目錄,而B目錄內有b.rar,C目錄內有c.rar及D目錄,D目錄內有d.rar
    能不能寫成解壓縮完後變成A(a. B(b.) C(c. D(d.)))這樣
    目前我的bat寫出來會變成全部解壓縮完後的rar都跑到執行bat的目錄下
    A(a.b.c.d. B C(D))這樣
    以下是小弟的程式碼 應該是目的位置設置問題 但是不知道要怎麼設定..
    希望大大可以解惑,小弟先謝了!
    @echo off
    set rar=”D:\Winrar\Rar.exe”
    for /R %%f in (*.rar) do %rar% x -o+ -p2119 %%f
    pause

留下評論

限制時效已用盡。請重新載入驗證碼。