要将文件移动到文件夹中,我使用此脚本
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "SPLITCHAR=-" & rem // (a single character to split the file names)
set "SEARCHSTR=_" & rem // (a certain string to be replaced by another)
set "REPLACSTR= " & rem // (a string to replace all found search strings)
set "OVERWRITE=" & rem // (set to non-empty value to force overwriting)
rem // Get file location and pattern from command line arguments:
set "LOCATION=%~1" & rem // (directory to move the processed files into)
set "PATTERNS=%~2" & rem // (file pattern; match all files if empty)
rem /* Prepare overwrite flag (if defined, set to character forbidden
rem in file names; this affects later check for file existence): */
if defined OVERWRITE set "OVERWRITE=|"
rem // Continue only if target location is given:
if defined LOCATION (
rem // Create target location (surpress error if it already exists):
2> nul md "%LOCATION%"
rem /* Loop through all files matching the given pattern
rem in the current working directory: */
for /F "eol=| delims=" %%F in ('dir /B "%PATTERNS%"') do (
rem // Process each file in a sub-routine:
call :PROCESS "%%F" "%LOCATION%" "%SPLITCHAR%" "%SEARCHSTR%" "%REPLACSTR%"
)
)
endlocal
exit /B
:PROCESS
rem // Retrieve first argument of sub-routine:
set "FILE=%~1"
rem // Split name at (first) split character and get portion in front:
for /F "delims=%~3" %%E in ("%~1") do (
rem // Append a split character to partial name:
set "FOLDER=%%E%~3"
)
setlocal EnableDelayedExpansion
rem // Right-trim partial name:
if not "%~4"=="" set "FOLDER=!FOLDER:%~4%~3=!"
set "FOLDER=!FOLDER:%~3=!"
rem /* Check whether partial name is not empty
rem (could happen if name began with split character): */
if defined FOLDER (
rem // Replace every search string with another:
if not "%~4"=="" set "FOLDER=!FOLDER:%~4=%~5!"
rem // Create sub-directory (surpress error if it already exists):
2> nul md "%~2\!FOLDER!"
rem /* Check if target file already exists; if overwrite flag is
rem set (to an invalid character), the target cannot exist: */
if not exist "%~2\!FOLDER!\!FILE!%OVERWRITE%" (
rem // Move file finally (surpress `1 file(s) moved.` message):
1> nul move /Y "!FILE!" "%~2\!FOLDER!"
)
)
endlocal
exit /B
要使用脚本,我必须
1-打开cmd
2-要执行批处理,我必须
cd C:\Users\Administrator\Desktop\T\
"C:\Users\Administrator\Desktop\T\build-folder-hierarchy.bat" "C:\Users\Administrator\Desktop\T\" "*.pdf"
但是问题是什么?
对于每个 .pdf 文件批量创建一个相对文件夹,但我不希望它以这种方式创建文件夹。看/image/bRsPc.png
aaaa aaaa S02 [folder]
aaaa aaaa S02e01.pdf [folder]
aaaa aaaa S02e02.pdf [folder]
aaa.aaaa.aaa.aa.aaaaa.S02 [folder]
我想要什么?
├─aaaa aaaa S02 [folder]
│ ├─aaaa aaaa S02e01.pdf[file]
│ ├─aaaa aaaa S02e02.pdf [file]
└─ ....
├─aaa.aaaa.aaa.aa.aaaaa.S02 [folder]
│ └─aaa.aaaa.aa.aa.aaaaa.S02E13.pdf [file]
:
只是一个示例名称,用于了解 .pdf 文件名称的格式
aaaaaaaaa aa aaaaa S01e12 720p Repack.pdf
aaa aaaaaaaaa S01e05 Versione 720p.pdf
aaa aaaaaaaa S01e05 Versione 1080p.pdf
aaa aaaa s2e06.pdf
aaa aaaa S03e12.pdf
aaa.aaaa.aaa.on.Earth.S02E13.pdf
aaa.aaaa.aaaa.S02E01.HDTV.x264.SUB.ITA.pdf
通常pdf文件名的格式是这样的[模式]
s01
s01e1
s1
s1e1
s1e01
s1e01-10
字符,例如e
和s
几乎总是出现在这些模式名称中
一般形式应该是
sxx
sxxex
sx
sxex
sxexx
sxexx-xx
X 是一个数字,字母 s 和 e 的大小写无关
Powershell 解决方案已被广泛接受。
最佳答案
你的问题很困惑。您没有描述文件名的格式,而只是显示一些示例,使用示例而不是规范可能会被误解。为其他问题编写的邮政代码不适用于此问题,当然没有用。您没有使用真实文件名显示输入和想要的输出示例,因此基于示例数据的解决方案可能不适用于真实数据。
编辑:添加了新规范。规范和程序代码均已根据评论中给出的要求进行了相应修改。
下面是我所理解的这个问题的具体情况:
"Given a series of *.pdf files with this format:
any string hereS##Eany string here.pdf / | ^-- "E" letter "S" letter digit
extract the string that ends before the "E" after the "S-digit" delimiter and move the file to a folder with such a name, "S" and "E" letters are not case sensitive. Ignore files that have not the previous format."
此代码根据此类规范解决问题:
@echo off
setlocal EnableDelayedExpansion
rem Change current directory to the one where this .bat file is located
cd "%~P0"
set "digits=0123456789"
rem Process all *.pdf files
for %%f in (*.pdf) do (
rem Get the folder name of this file
call :getFolder "%%f"
rem If this file have a properly formatted name: "headS##Etail"
if defined folder (
rem Move the file to such folder
if not exist "!folder!" md "!folder!"
move "%%f" "!folder!"
)
)
goto :EOF
:getFolder file
set "folder="
set "file=%~1"
set "head="
set "tail=%file%"
:next
for /F "delims=%digits%" %%a in ("%tail%") do set "head=%head%%%a"
set "tail=!file:*%head%=!"
if not defined tail exit /B
if /I "%head:~-1%" equ "S" goto found
:digit
if "!digits:%tail:~0,1%=!" equ "%digits%" goto noDigit
set "head=%head%%tail:~0,1%"
set "tail=%tail:~1%"
goto digit
:noDigit
goto next
:found
for /F "delims=Ee" %%a in ("%tail%") do set "folder=%head%%%a"
exit /B
要使用该批处理文件,请将其放在原始文件所在的同一文件夹中,然后不带参数地执行它;您也可以通过在资源管理器中双击来执行它。 session 示例:
C:\Users\Antonio\Documents\test> dir /B
test.bat
The_Good_Wife_S06e15.pdf
The_Good_Wife_S06e22.pdf
TOCCO_ANGELO_4.pdf
True Blood S07e07_001.pdf
True Detective S02E03-04 Repack.pdf
True Detective S02e03.pdf
True Detective S02e03_001.pdf
True.Detective.S02e02.1080p.WEBMux.pdf
Tudors S04e08.pdf
Tutti pazzi per amore s3e15-16.pdf
Tutto Pu‗ Succedere S01e01-02.pdf
Twin Peaks s1e1-8.pdf
Twin Peaks s2e16-22.pdf
Tyrant S02e07.pdf
Tyrant.S01e01_02.720p.DLMux.pdf
Ultimo 2 - La Sfida.pdf
Ultimo 3 -L Infiltrato.pdf
Una Mamma Imperfetta S02e01-13.pdf
Under the Dome S02e02 Versione 720p.pdf
Under.the.Dome.S03E07.HDTV.x264.SUB.ITA.pdf
C:\Users\Antonio\Documents\test> test.bat
C:\Users\Antonio\Documents\test> tree /F
Listado de rutas de carpetas
El número de serie del volumen es 00000088 0895:160E
C:.
│ test.bat
│ TOCCO_ANGELO_4.pdf
│ Ultimo 2 - La Sfida.pdf
│ Ultimo 3 -L Infiltrato.pdf
│
├───The_Good_Wife_S06
│ The_Good_Wife_S06e15.pdf
│ The_Good_Wife_S06e22.pdf
│
├───True Blood S07
│ True Blood S07e07_001.pdf
│
├───True Detective S02
│ True Detective S02E03-04 Repack.pdf
│ True Detective S02e03.pdf
│ True Detective S02e03_001.pdf
│
├───True.Detective.S02
│ True.Detective.S02e02.1080p.WEBMux.pdf
│
├───Tudors S04
│ Tudors S04e08.pdf
│
├───Tutti pazzi per amore s3
│ Tutti pazzi per amore s3e15-16.pdf
│
├───Tutto Pu‗ Succedere S01
│ Tutto Pu‗ Succedere S01e01-02.pdf
│
├───Twin Peaks s1
│ Twin Peaks s1e1-8.pdf
│
├───Twin Peaks s2
│ Twin Peaks s2e16-22.pdf
│
├───Tyrant S02
│ Tyrant S02e07.pdf
│
├───Tyrant.S01
│ Tyrant.S01e01_02.720p.DLMux.pdf
│
├───Una Mamma Imperfetta S02
│ Una Mamma Imperfetta S02e01-13.pdf
│
├───Under the Dome S02
│ Under the Dome S02e02 Versione 720p.pdf
│
└───Under.the.Dome.S03
Under.the.Dome.S03E07.HDTV.x264.SUB.ITA.pdf
如果“S”分隔符之前的文件名不能包含数字,则此代码会简单得多。此解决方案假设文件名中没有感叹号 !
。
关于powershell - 根据某些文件名模式对文件进行排序并将其移动到目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39944685/