請教會寫批次檔高手,小弟有個自動備份壓縮的批次檔想要執行,希望達到的條件有下面三點:
目前程式遇到問題
目前批次檔內容
@Echo Off
Set PathD=D:\Data
Set LogD=E:\Log\
For /F "Tokens=1-4 Delims=/ " %%a IN ("%Date%") Do (
Set LogDate=%%a%%b%%c
Set LogF=Data_%%a-%%b-%%c.log
)
T:
Del /f /s /q T:*._mp
Del /f /s /q T:\Thumbs.db
For /f "Tokens=* Delims=." %%I IN ('Dir /b') DO (
"C:\Program Files\7-Zip\7z.exe" -tZip -Mx9 -mmt a %Pathd%%LogDate%"%%I.zip" "T:%%I*" >> %LogD%%LogF%
timeout /t 10
)
E:
請參考
如要修改同時執行的數量請修改 Set Thread=3 <-同時執行的數量
@Echo OFF
Title Pseudo Daemon .......
SetLocal ENABLEDELAYEDEXPANSION
Set Thread=3
Set Current=0
Set Files=0
(For /f %%i In ('dir /ad /b "%~pd0"') Do (
Set /a FileTotal += 1
Set FileTotal!FileTotal!="%~pd0%%i"
))||(Echo 需要有資料夾&Pause&Exit)
:Start
Cls
Echo Files = !Files! / %FileTotal%
Echo. 工作階段 PID 記憶體用量
For /f "eol=資 skip=1 tokens=2-5" %%a In ('TaskList /NH /FI "WINDOWTITLE eq %Thread%Thread"') do (
Echo. %%c %%a %%d
Set /a Current =!Current!+1
)
IF !Current! GEQ %Thread% (
TimeOut /T 1
Set Current=0
Goto :Start
)
::這裡用來放要執行的命令,將 "timeout /t 5" 修改成要執行的命令
Start /Min "%Thread%Thread" "%SystemRoot%\system32\cmd.exe" /c "timeout /t 5"
Set /a Files = !Files!+1
If !Files! GTR !FileTotal! Goto :EOF
Goto :Start
非常謝謝IT邦大師蟹老闆。
這邊可以再請教一下您提供的方式嗎?
謝謝您。
1.除了計算數量外也會將目錄名稱加到變數中,以便後續使用
2.如果要取得資料夾名稱(含路徑)可以使用 !FileTotal%Files%!
這個變數(FileTotal)命名錯誤,且沒有先賦值會造成一些問題,所以有做了一些修改,修改後取得資料夾名稱(含路徑)使用 !Dir%Files%!
@Echo OFF
Title Pseudo Daemon .......
SetLocal ENABLEDELAYEDEXPANSION
Set Thread=3
Set Current=0
Set Files=0
Set FileTotal=0
(For /f %%i In ('dir /ad /b "%~pd0"') Do (
Set Dir!FileTotal!="%~pd0%%i"
Set /a FileTotal += 1
))||(Echo 需要有資料夾&Pause&Exit)
:Start
Cls
Echo Files = !Files! / %FileTotal%
Echo. 工作階段 PID 記憶體用量
For /f "eol=資 skip=1 tokens=2-5" %%a In ('TaskList /NH /FI "WINDOWTITLE eq %Thread%Thread"') do (
Echo. %%c %%a %%d
Set /a Current =!Current!+1
)
IF !Current! GEQ %Thread% (
TimeOut /T 1
Set Current=0
Goto :Start
)
::這裡用來放要執行的命令,將 "timeout /t 5" 修改成要執行的命令
Start "%Thread%Thread" "%SystemRoot%\system32\cmd.exe" /c "timeout /t 5"
Set /a Files = !Files!+1
If Not !Files! LSS !FileTotal! Goto :EOF
Goto :Start
增加了:
Set FileTotal=0
修改了:
Set Dir!FileTotal!="%~pd0%%i"
If Not !Files! LSS !FileTotal! Goto :EOF
謝謝的 IT邦大師蟹老闆 回覆
不過這邊測試有遇到幾個問題,想與您討論一下
我只是在下述這一行修改了 "%Thread%Thread" 這個變成 "%Thread%:Thread",程式就會變成一口氣執行了所有資料夾數量(比方說有10個目錄就執行10個視窗),這是為什麼?
Start "%Thread%:Thread" "%SystemRoot%\system32\cmd.exe" /c "timeout /t 60"
是可以取得資料夾路徑與資料夾名稱,但是只要資料夾有空格就無法取得完整的資料夾名稱。例如小弟進行測試的時候,新增了10個資料夾名稱(New folder、New folder (2)、New folder (3)....以此類推),但是在執行的時候只能看到取得的資料夾名稱只有New,不是New folder這個名稱。
如果不需要路徑,只要完整的資料夾名稱,可以怎麼修改?
謝謝您!!
1.這個"%Thread%Thread"是用於計算視窗數量的指標,如果修改則須一併修改
For /f "eol=資 skip=1 tokens=2-5" %%a In ('TaskList /NH /FI "WINDOWTITLE eq %Thread%Thread"')....
中的 %Thread%Thread
2.如果要取用變數需加上""將變數包起來,若僅是ECHO 印出變數則可無""
3.使用這個語法 "!Dir%Files%!"
更新:
3誤解了,請將Set Dir!FileTotal!="%~pd0%%i"
修改成Set Dir!FileTotal!="%%i"
感謝 IT邦大師蟹老闆 回覆
這邊提供測試環境的畫面,如圖樣子,資料夾的名稱有可能存在多個空格
程式如您提供的,我有修改一小部分
Start "%Thread%Thread" "%SystemRoot%\system32\cmd.exe" /k "Echo !Dir%Files%!"
程式執行的結果,可以看到取得的資料夾名稱僅有開頭的"New"而已
請問這樣子有辦法解決嗎?
疏忽了!
請在(For /f %%i In ('dir /ad /b "%~pd0"') Do ....
加上這個參數 "tokens=*" 即可For /f "tokens=*" %%i In ('dir /ad /b "%~pd0"') Do (
感謝 IT邦大師蟹老闆,測試已經可以正常使用了
非常謝謝您這麼熱心提供協助!!
這邊提供修改後的多執行緒方式壓縮備份資料夾批次檔(7Zip)
@Echo OFF
Title Pseudo Daemon .......
SetLocal ENABLEDELAYEDEXPANSION
Set Thread=3
Set Current=0
Set Files=0
Set FileTotal=0
(For /f "tokens=*" %%i In ('dir /ad /b "%~pd0"') Do (
Set Dir!FileTotal!="%%i"
Set /a FileTotal += 1
))||(Echo 需要有資料夾 && Pause && Exit)
:Start
Cls
Echo Files = !Files! / %FileTotal%
Echo. 工作階段 PID 記憶體用量
For /f "eol=資 skip=1 tokens=2-5" %%a In ('TaskList /NH /FI "WINDOWTITLE eq %Thread%Thread"') do (
Echo. %%c %%a %%d
Set /a Current =!Current!+1
)
IF !Current! GEQ %Thread% (
TimeOut /T 5
Set Current=0
Goto :Start
)
::這裡用來放要執行的命令,將 "timeout /t 5" 修改成要執行的命令
Start "%Thread%Thread" "%SystemRoot%\system32\cmd.exe" /c "C:\PROGRA~1\7-zip\7z.exe -Mx9 -mmt -tZip a !Dir%Files%!.zip !Dir%Files%!"
Set /a Files = !Files!+1
If Not !Files! LSS !FileTotal! Goto :EOF
Goto :Start