![根据文件名的一部分将文件分类到文件夹中](https://linux22.com/image/1584132/%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%E5%B0%86%E6%96%87%E4%BB%B6%E5%88%86%E7%B1%BB%E5%88%B0%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD.png)
我希望将大约 3,000 个 pdf 文件分类到各自的文件夹中。所有 3,000 个文件都放在一个文件夹中,并遵循相同的格式。
COURSE NAME - EMPLOYEEFIRSTNAME EMPLOYEELASTNAME
我已经创建了所有文件夹,但现在想将相应的 PDF 文档移动到相应的文件夹中。我发现这个方便的答案可以帮助我入门:如何根据文件名将文件排序到文件夹中 - Windows CMD。
这是我目前正在尝试修改的内容:
:: C:\Users\User\Desktop\Training Test.cmd
@Echo off
PushD "C:\Users\User\Desktop\Training Test"
For %%A in (*.pdf) do For /F "tokens=2,3delims=-." %%B in ("%%A") Do (
If Not exist "%%B" MD "%%B"
Move "%%A" "%%B"
)
PopD
我发现它正在创建一个新文件夹,员工姓名前面有一个空格。我有一个名为“ EMPLOYEEFIRST EMPLOYEELAST
”的文件夹,但它正在创建一个新文件夹“ EMPLOYEEFIRST EMPLOYEELAST
”(请注意开头的空格)。
我还注意到,它会为那些名字或姓氏带连字符的员工创建一个新文件夹。EMPLOYEE-FIRST EMPLOYEE-LAST
只会变成“ EMPLOYEE
”的新文件夹。
我对这一切还很陌生。有没有办法解决文件夹名称中的空格和连字符名称的问题?
答案1
看起来课程名称和名字/姓氏之间的分隔符是序列space-space。
不幸的是,for /f
不能将其视为一个分隔符,但会将它们全部视为单个分隔符,更糟糕的是,将相邻的分隔符视为只有一个。
您可以使用字符串替换来替换-
一个字符:
,然后在其上进行拆分。
字符串替换需要普通(元)变量,并且代码块内部需要延迟扩展。
我的 RAM 驱动器 a:\ 上的示例树之前:
> tree a:\ /F
A:\
COURSE NAME - EMPLOYEE-FIRST EMPLOYEE-LAST.pdf
COURSE NAME - EMPLOYEEFIRSTNAME EMPLOYEELASTNAME.pdf
NAME COURSE - EMPLOYEE-FIRST EMPLOYEE-LAST.pdf
NAME COURSE - EMPLOYEEFIRSTNAME EMPLOYEELASTNAME.pdf
运行此批处理文件:
:: Q:\Test\2019\03\01\SU_1410384.cmd
@Echo off & SetLocal EnableDelayedExpansion
PushD "C:\Users\User\Desktop\Training Test"
For /f "delims=" %%A in ('dir /B "* - *.pdf" 2^>Nul') do (
Set "BaseName=%%~nA"
Set "BaseName=!BaseName: - =:!"
For /F "tokens=1,2 delims=:" %%B in ("!BaseName!") Do (
If Not exist "%%B" MD "%%B"
Move "%%A" "%%B" 1>Nul
)
)
PopD
之后是树:
> tree a:\ /F
A:\
├───COURSE NAME
│ COURSE NAME - EMPLOYEE-FIRST EMPLOYEE-LAST.pdf
│ COURSE NAME - EMPLOYEEFIRSTNAME EMPLOYEELASTNAME.pdf
│
└───NAME COURSE
NAME COURSE - EMPLOYEE-FIRST EMPLOYEE-LAST.pdf
NAME COURSE - EMPLOYEEFIRSTNAME EMPLOYEELASTNAME.pdf