根据文件名的一部分将文件分类到文件夹中

根据文件名的一部分将文件分类到文件夹中

我希望将大约 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

相关内容