[英]script to copy particular files with the end character from one directory to another directory
[英]Group files from a directory to another directory with a particular pattern in filename
因此,我有一個目錄(D:\\ Project \\ Archive),其中包含很多.txt文件,它們的文件名模式不同,但擴展名前的最后9個字符除外。 我列舉了6個文件名作為示例:
這些文件沒有特定的順序。 顯而易見的是,文件名的最后9個字符(在擴展名之前)遵循4個字符的模式,后跟一個下划線,后跟4個數字。 這9個字符對於幾個文件將是相同的。
我的目標是歸檔具有相同9個字符的文件,而不管文件數量如何。 zip文件的名稱應為帶有模式的9個字符,文件名應不包含這9個字符。 上面的示例應創建3個存檔文件:
我進行分組的方法是提取第一個文件名的模式,將文件移至_toArchive目錄,然后循環瀏覽其余文件以檢查相同的模式。 如果匹配,則將其移動到目錄_toArchive,並繼續直到到達內部循環的末尾。 然后,腳本將遍歷到_toArchive,並壓縮文件。 然后控件返回到第一個循環以對其余文件重復相同的操作。
我面臨的問題主要是分組問題。 即使邏輯工作正常,但啟用延遲擴展后,即使文件已移至其他目錄,變量仍保留值。 當循環嘗試訪問那些文件時,這會導致不必要的開銷,從而導致“找不到文件”錯誤消息。 有沒有辦法通過使用數組來取消設置變量? 還是其他比我正在使用的方法容易的方法?
我只是發布分組操作的代碼,因為一旦弄清楚了,我將能夠實現其余的代碼。
set WORKDIR=D:\Project\Archive
setLocal enableDelayedExpansion
for /f "tokens=*" %%g in ('dir /b %WORKDIR%\*.txt') do (
set firstFile=%%~ng
set firstPattern=!firstFile:~-9!
move /y %WORKDIR%\%%g %WORKDIR%\_toArchive
call :checkPatterns
)
:checkPatterns
for /f "tokens=*" %%i in ('dir /b %WORKDIR%\*.txt') do (
set fileToGroup=%%i
set groupedFile=%%~ni
set groupedPattern=!groupedFile:~-9!
call :groupPatterns
)
:groupPatterns
if "%groupedPattern%" == "%firstPattern%" (
move /y %WORKDIR%\%fileToGroup% %WORKDIR%\_toArchive
)
我建議采取另一種方法:
以下批次要求7zip可以在路徑中的某處到達:
:: Q:\Test\2019\01\14\SO_54189436.cmd
@Echo off&SetLocal EnableDelayedExpansion
set WORKDIR=D:\Project\Archive
:: clear Group[] variables
for /f "delims==" %%A in ('Set Group[ 2^>Nul') Do set "%%A="
:: get groups
for /f "tokens=*" %%g in ('dir /b %WORKDIR%\*.txt') do (
set FileName=%%~ng
set "Group[!FileName:~-9!]=!FileName:~-9!"
)
set Group[
:: procss groups
for /f "tokens=2 delims==" %%A in ('Set Group[ 2^>Nul') Do (
MD "%WORKDIR%\%%A" 1>Nul 2>&1
for %%B in ("%WORKDIR%\*%%A.txt") Do Call :MoveRenFile "%%A" "%%B"
Rem zip files and delete group folder
PushD "%WORKDIR%\%%A"
7z a "..\%%A.zip" *
PopD
RD /S /Q "%WORKDIR%\%%A"
)
Goto :Eof
:MoveRenFile
Set "File=%~nx2"
set "NewName=%WORKDIR%\%~1\!File:_%~1=!"
Echo Move "%~2" "%NewName%"
Move "%~2" "%NewName%" >NUL
Goto :Eof
文件被重命名並存儲在組文件夾中的中間結果:
> tree %Workdir% /F
└───Project
└───Archive
├───GGTL_7642
│ abcd.txt
│ hsbhsd.txt
│
├───HTQB_1412
│ 123456.txt
│ 1a2b3.txt
│
├───HTQB_7642
│ yt7777.txt
│
└───JTYU_7177
pikachu.txt
最終結果與zip文件:
> tree /F D:\
D:\
└───Project
└───Archive
GGTL_7642.zip
HTQB_1412.zip
HTQB_7642.zip
JTYU_7177.zip
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.