請教會寫批次檔高手,
小弟有個自動壓縮的批次檔想要執行,
希望達到的條件有下面幾點:
目前程式遇到問題:
目前批次檔內容
@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\*" -xr@特定清單.txt
) || (
"%a%" a -tzip "%%~dpa%%~na.zip" %%a -xr@@特定清單.txt
)
)
給你一個觀點,既然要用powershell,不如考慮用python當批次檔用,對檔案處理的彈性大且有可擴展的7z壓縮元件可用,多執行緒也可以實現
你唯一要做的,就是在你的電腦上安裝python直譯器(跟powershell的意思差不多,也是要另外安裝或新系統內建)
沒有相容現有的程式碼的考慮的話,直上3.9即可
https://www.python.org/downloads/windows/
(記得加入path)
牢記一件事,python並非windows原生,所以資料夾的反斜線 \ 一定要改成正斜線(除號 / ),不然會有很大的機會找不到檔案
例:C:/windows/system32/drivers/etc/hosts
主要考量以bat或powershell為主,
因移植到他台電腦需再安裝python, 故不考慮python作法
請參考
說明:
Folder 來源資料夾
Thread 同時執行的數量
Wait 當同時執行的數量達到指定時等待多久重新偵測,新開的執行動作時間長時可增加秒數
[O] 這個變數必須是一個空白字元
Par 取得的同檔案名.不同副檔名集合,不含路徑
@Echo OFF
Title Pseudo Daemon .......
SetLocal ENABLEDELAYEDEXPANSION
Set Folder=d:\test\test\
Set Thread=5
Set Files=1
Set FileTotal=0
Set Wait=1
Set [O]=
CD /D %Folder%
(For /f "delims=*" %%i In ('Dir /A-D /B /O-N /L "%Folder%"') Do Set [O]%%~ni="%%~nxi" ![O]%%~ni!)||(Echo 找不到檔案可進行操作&Pause&Exit)
For /f %%i In ('Set [O]^|Find /V /C ""') Do Set FileTotal=%%i&Goto :Next
:Start
Cls
Set Current=1
Echo Action = %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 %Files% GEQ %FileTotal% Goto :EOF
IF Not %Current% GTR %Thread% Goto :Next
Timeout /t %Wait%&Goto :Start
:Next
For /F "Skip=%Files% Delims== tokens=2*" %%i in ('Set [O]') Do Set Par=%%i&Goto :One
:One
::這裡用來放要執行的命令,將 "timeout /t 5" 修改成要執行的命令
Start /min "%Thread%Thread" "%SystemRoot%\system32\cmd.exe" /c "TimeOut /t 5"
Set /a Files +=1
Goto :Start
這個批次檔改造自DOS批次檔同時執行多個壓縮