@ECHO Off
SETLOCAL enabledelayedexpansion
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*-????_??-*.txt" '
) DO (
SET "filename=%%a"
SET "filename=!filename:-= !"
SET "moved="
FOR %%b IN (!filename!) DO IF NOT DEFINED moved (
FOR /f "tokens=1*delims=_" %%p IN ("%%b") DO IF "%%q" neq "" (
ECHO MD "%destdir%\%%p_%%q" 2>NUL
ECHO MOVE "%sourcedir%\%%a" "%destdir%\%%p_%%q\"
SET "moved=Y"
)
)
)
GOTO :EOF
你需要改變的sourcedir
和destdir
設置以適合你的情況。
爲了測試目的,所需的MD命令僅僅是ECHO
。 驗證命令是否正確後,將ECHO(MD
更改爲MD
以實際創建目錄。附加2>nul
以抑制錯誤消息(例如,當目錄已經存在時)
爲了測試目的,所需的MOVE命令僅僅是ECHO
。 確認命令正確後,將ECHO(MOVE
更改爲MOVE
以實際移動文件。附加>nul
抑制報告消息(例如。1 file moved
)
的dir
命令返回每個文件匹配匹配%%a
,從那裏向filename
文件名。
然後filename
中的每個-
都被一個空格替換,並且for..%%b
將文件名處理爲空格分隔字符串的列表。
在%%b
。每一串標記化和第一字符串匹配串 _ 串被分配給%%p
和%%q
。如果%%q
非空,然後我們發現串 _ 串這樣做md
和move
並設置moved
標誌,以確保發現被忽略的是更多的匹配。
注意,這不會與處理情況,你有一個像東西 -abc_d-EFGH_JK-文件名東西 - 它假定所需的目標是串 _ 字符串的第一次亮相這在這種情況下將是abc_d
,而不是EFGH_JK
。如果需要,這很容易修復。
修訂中校正的光以文件名結構(無下劃線 - 僅破折號)
@ECHO Off
SETLOCAL enabledelayedexpansion
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\????-*-????-??-*.txt" '
) DO (
SET "filename=%%a"
CALL :newname !filename:-= !
IF DEFINED newdir (
ECHO MD "!newdir!" 2>NUL
ECHO MOVE "%sourcedir%\%%a" "%destdir%\!newdir!\"
)
)
GOTO :EOF
:newname
IF "%5" neq "" shift&GOTO newname
SET "newdir=%1-%2"
IF "%newdir:~4,1%" equ "-" IF "%newdir:~7%" equ "" IF "%newdir:~6,1%" neq "" GOTO :EOF
SET "newdir="
GOTO :eof
新的代碼查找一個序列 - ???? - ?? - 串 - 字符串並挑選其中的最後一個。
由於[SO]不是腳本編寫服務,您應該顯示您在編碼時付出的努力,以便在遇到困難時獲得幫助。由於不存在真正的RegEx功能,因此使用'-'分隔的各種元素很難批量分析。但是你可以使用j-/vbscipt或者PowerShell。 – LotPings