WinRAR於指令模式自動化壓縮

最近有個需求,就是固定時間內把某個資料夾內的檔案(不含子資料夾),壓縮成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 thoughts on “WinRAR於指令模式自動化壓縮

    1. 順手寫了一個批次檔可以解決這個問題
      過幾天我再寫一篇詳細的文章,先把程式給你使用一下
      把下面存成 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”)
      )

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

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

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

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

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

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

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

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

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

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

      這樣就可以通吃了

  3. 把下面的文字存成 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”)
    )

  4. 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 時,刪除目錄樹結構不再要求確認

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

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

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

  6. 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

  7. 用您說的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

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

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

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

  10. 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
    請按任意鍵繼續 . . .

  11. 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,那你就要自己想辦法解決了。

  12. 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的說,非常謝謝您的指點。

  13. 請問如果是分割的壓縮檔要如何全部刪除呢?
    因為採用%%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”)
    )

  14. 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”)

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

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

    這樣子 謝謝

  16. 大大想問你如果想做成把檔案解壓縮到當前目錄怎麼寫呢?
    類似像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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *