請教關於DOS批次檔和7-ZIP批次壓縮的問題



贊助商連結


tzoying
2008-07-29, 10:19 PM
1.小弟參考GOOGLE上的介紹,寫出兩個用於日常備份的批次檔
其中有兩個地方怎麼改都無法順利執行..
例如:
%7z% a -mx=9 -t7z D:\X\A.idm.%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\X\A.idm.200?????
if errorlevel 0 "GOTO RESULT && DEL /Q D:\X\A.idm.200?????"
if not errorlevel 0 SET sub_step=3

先用7Z壓縮每日備份的檔案(EX: D:\X\A.idm.20080729....)
假如成功則執行刪除原檔和輸出結果到LOG檔,失敗則是輸出問題到LOG檔
其中DEL /Q D:\X\A.idm.200????? 不知為何一直無法正確執行,參考網上教學加上""一樣無法執行??
而輸出到LOG檔的部份:
----------------------------------------------------
------------- 20080729 個人資料備份檔 --------------
----------------------------------------------------
開始備份時間:
下午 01:07
----------------------------------------------------
-------- 壓縮 MSN表情符號、大頭貼、動畫快遞 --------
----------------------------------------------------
----------------------------------------------------
---------------- 輸出 備份完成 時間 ----------------
----------------------------------------------------
結束備份時間:
下午 01:07
----------------------------------------------------
壓縮完成!!
︿︿︿︿︿︿
壓縮結果不知為何會跑到最下方,應該如何改成如下方所示呢??
----------------------------------------------------
-------- 壓縮 MSN表情符號、大頭貼、動畫快遞 --------
----------------------------------------------------
壓縮完成!!
----------------------------------------------------
----------- 壓縮 密碼管理資料(2個檔案)-----------
----------------------------------------------------
壓縮完成!!
----------------------------------------------------
---------------- 輸出 備份完成 時間 ----------------
----------------------------------------------------
結束備份時間:
下午 01:07
----------------------------------------------------


2.關於7-ZIP批次壓縮的部份,GOOGLE很久找到一個批次檔
@echo off
set a=c:\program files\7-zip\7z.exe
for %%a in (%*) do (
dir /a %%a|findstr "DIR" >nul 2>nul && (
"%a%" a -tzip "%%~dpa%%~na.zip" "%%~a\*"
) || (
"%a%" a -tzip "%%~dpa%%~na.zip" %%a
)
)
存成批次檔放到SendTo裡,是可以正確的批次壓縮成ZIP檔
可小弟改成如下所示后:
@echo off
set a=C:\Program Files\7-Zip\7z.exe
for %%a in (%*) do (
dir /a %%a|findstr "DIR" >nul 2>nul && (
"%a%" a -t7z "%%~dpa%%~na.7z" "%%~a\*"
) || (
"%a%" a -t7z "%%~dpa%%~na.7z" %%a
)
)
檔少時可以正確執行,一多(我是一次壓一百多個)就會出現錯誤,不知是哪裡出錯呢?


以上兩個問題還請各位電腦達人幫忙解惑,感激不盡 ORZ


附上兩個資料備份的批次檔,也請大伙不吝幫忙改善一下 ^^

===============================
@echo off

SET month_log="D:\LOG\每月資料備份壓縮_%date:~0,4%%date:~5,2%%date:~8,2%.log"
SET 7Z="C:\program Files\7-zip\7z"
SET /a run_step=0
SET sub_step=0
if exist %month_log% del %month_log%
GOTO CHOICE

:CHOICE
if "%run_step%"=="0" GOTO STEP_0
if "%run_step%"=="1" GOTO STEP_1
if "%run_step%"=="2" GOTO STEP_2
if "%run_step%"=="3" GOTO STEP_3_1
if "%run_step%"=="4" GOTO STEP_4_1
if "%run_step%"=="5" GOTO STEP_5
if "%run_step%"=="6" GOTO STEP_6
if "%run_step%"=="7" GOTO END
GOTO END

:STEP_0
SET run_step=0
ECHO ---------------------------------------------------- >> %month_log%
ECHO ------------- %date:~0,4%%date:~5,2%%date:~8,2% 個人資料備份檔 -------------- >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
echo 開始備份時間: >> %month_log%
TIME /T >> %month_log%
GOTO STEP_1

:STEP_1
SET /a run_step=1
ECHO ---------------------------------------------------- >> %month_log%
ECHO -------- 壓縮 MSN表情符號、大頭貼、動畫快遞 -------- >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
%7z% a -mx=9 -t7z D:\BACKUP\MSN\[email protected].%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\BACKUP\MSN\[email protected]
if errorlevel 0 "GOTO RESULT && RD /S/Q D:\BACKUP\MSN\[email protected]\"
if not errorlevel 0 GOTO RESULT
GOTO STEP_2

:STEP_2
SET /a run_step=2
ECHO ---------------------------------------------------- >> %month_log%
ECHO ------------- 壓縮 記帳資料(1個檔案)------------- >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
%7z% a -mx=9 -t7z D:\BACKUP\Charge\MyMoneyData.mdb.%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\BACKUP\Charge\MyMoneyData.mdb.200?????
if errorlevel 0 "GOTO RESULT && DEL /Q D:\BACKUP\Charge\MyMoneyData.mdb.200?????"
if not errorlevel 0 GOTO RESULT
GOTO STEP_3_1

:STEP_3_1
SET /a run_step=3
ECHO ---------------------------------------------------- >> %month_log%
ECHO ----------- 壓縮 密碼管理資料(2個檔案)----------- >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
%7z% a -mx=9 -t7z D:\BACKUP\PassWord\my.idm.%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\BACKUP\PassWord\my.idm.200?????
if errorlevel 0 "GOTO RESULT && DEL /Q D:\BACKUP\PassWord\my.idm.200?????"
if not errorlevel 0 SET sub_step=3
GOTO STEP_3_2

:STEP_3_2
SET sub_step=
%7z% a -mx=9 -t7z D:\BACKUP\PassWord\my.apw.%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\BACKUP\PassWord\my.apw.200?????
if errorlevel 0 "GOTO RESULT && DEL /Q D:\BACKUP\PassWord\my.apw.200?????"
if not errorlevel 0 GOTO RESULT
GOTO STEP_4_1

:STEP_4_1
SET /a run_step=4
ECHO ---------------------------------------------------- >> %month_log%
ECHO ------------ 壓縮 模擬器資料(2個檔案)------------ >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
%7z% a -mx=9 -t7z D:\BACKUP\Game\OfflineList_conf.ini.%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\BACKUP\Game\OfflineList_conf.ini.200?????
if errorlevel 0 "GOTO RESULT && DEL /Q D:\BACKUP\Game\OfflineList_conf.ini.200?????"
if not errorlevel 0 SET sub_step=4
GOTO STEP_4_2

:STEP_4_2
SET sub_step=
%7z% a -mx=9 -t7z D:\BACKUP\Game\clrmamepro_cmpro.ini.%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\BACKUP\Game\clrmamepro_cmpro.ini.200?????
if errorlevel 0 "GOTO RESULT && DEL /Q D:\BACKUP\Game\clrmamepro_cmpro.ini.200?????"
if not errorlevel 0 GOTO RESULT
GOTO STEP_5

:STEP_5
SET /a run_step=5
ECHO ---------------------------------------------------- >> %month_log%
ECHO ------------ 壓縮 hosts 檔案(1個檔案)------------ >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
%7z% a -mx=9 -t7z D:\BACKUP\NET\hosts.%date:~0,4%%date:~5,2%%date:~8,2%.7z D:\BACKUP\NET\hosts
if errorlevel 0 "GOTO RESULT" & "DEL /Q D:\BACKUP\NET\hosts"
if not errorlevel 0 GOTO RESULT
GOTO STEP_6

:STEP_6
SET /a run_step=6
ECHO ---------------------------------------------------- >> %month_log%
ECHO ---------------- 輸出 備份完成 時間 ---------------- >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
ECHO 結束備份時間: >> %month_log%
TIME /T >> %month_log%
ECHO ---------------------------------------------------- >> %month_log%
set /a run_step=%run_step% + 1
GOTO END

:RESULT
if errorlevel 0 ECHO 壓縮完成!! >> %month_log%
if errorlevel 1 ECHO 檔案被鎖住,無法壓縮!! >> %month_log%
if errorlevel 2 ECHO 發生嚴重錯誤!! >> %month_log%
if errorlevel 7 ECHO 壓縮命令列錯誤!! >> %month_log%
if errorlevel 8 ECHO 記憶體不足!! >> %month_log%
if errorlevel 255 GOTO ECHO 使用者中斷!! >> %month_log%
set /a run_step=%run_step% + 1
IF "%sub_step%"=="3" GOTO STEP_3_2
IF "%sub_step%"=="4" GOTO STEP_4_2
GOTO CHOICE


:END
SET month_log=
SET 7Z=
SET run_step=
SET sub_step=

================================

@echo off

SET day_log="D:\LOG\每日資料備份_%date:~0,4%%date:~5,2%%date:~8,2%.log"

IF EXIST %day_log% del %day_log%

ECHO ---------------------------------------------------- >> %day_log%
ECHO ------------- %date:~0,4%%date:~5,2%%date:~8,2% 個人資料備份檔 -------------- >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%
echo 開始備份時間: >> %day_log%
TIME /T >> %day_log%


ECHO ---------------------------------------------------- >> %day_log%
ECHO -------- 備份 MSN表情符號、大頭貼、動畫快遞 -------- >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%
RD /S/Q D:\BACKUP\MSN\[email protected]\
XCOPY "C:\Documents and Settings\my\Local Settings\Application Data\Microsoft\Messenger\[email protected]\ObjectStore" "D:\BACKUP\MSN\[email protected]\ObjectStore" /D /H /I /S /Y
ECHO 備份完成!! >> %day_log%

ECHO ---------------------------------------------------- >> %day_log%
ECHO ------------- 備份 記帳資料(1個檔案)------------- >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%
ECHO D:\BACKUP\Charge\MyMoneyData.mdb >> %day_log%
COPY D:\BACKUP\Charge\MyMoneyData.mdb D:\BACKUP\Charge\MyMoneyData.mdb.%date:~0,4%%date:~5,2%%date:~8,2% /y >> %day_log%


ECHO ---------------------------------------------------- >> %day_log%
ECHO ----------- 備份 密碼管理資料(2個檔案)----------- >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%
ECHO D:\BACKUP\PassWord\my.idm >> %day_log%
COPY D:\BACKUP\PassWord\my.idm D:\BACKUP\PassWord\my.idm.%date:~0,4%%date:~5,2%%date:~8,2% /y >> %day_log%
ECHO D:\BACKUP\PassWord\my.apw >> %day_log%
COPY D:\BACKUP\PassWord\my.apw D:\BACKUP\PassWord\my.apw.%date:~0,4%%date:~5,2%%date:~8,2% /y >> %day_log%


ECHO ---------------------------------------------------- >> %day_log%
ECHO ------------ 備份 模擬器資料(2個檔案)------------ >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%
ECHO D:\Share\_Emu_\OfflineList\conf.ini >> %day_log%
COPY D:\Share\_Emu_\OfflineList\conf.ini D:\BACKUP\Game\OfflineList_conf.ini.%date:~0,4%%date:~5,2%%date:~8,2% /y >> %day_log%
ECHO D:\Share\_Emu_\clrmamepro\cmpro.ini >> %day_log%
COPY D:\Share\_Emu_\clrmamepro\cmpro.ini D:\BACKUP\Game\clrmamepro_cmpro.ini.%date:~0,4%%date:~5,2%%date:~8,2% /y >> %day_log%


ECHO ---------------------------------------------------- >> %day_log%
ECHO ------------ 備份 hosts 檔案(1個檔案)------------ >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%
ECHO C:\WINDOWS\system32\drivers\etc\hosts >> %day_log%
COPY C:\WINDOWS\system32\drivers\etc\hosts D:\BACKUP\NET\ /Y >> %day_log%


ECHO ---------------------------------------------------- >> %day_log%
ECHO ---------------- 輸出 備份完成 時間 ---------------- >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%
ECHO 結束備份時間: >> %day_log%
TIME /T >> %day_log%
ECHO ---------------------------------------------------- >> %day_log%

===================================

贊助商連結


琥珀
2008-07-30, 07:12 PM
goto 不能這樣做。無論是寫批次檔還是寫程式,在非必要的情況下,不要用 goto 指令。