0

我有一组每天生成的文件,称为例如

01234fileA.pdf
01234SecondFile.pdf
01234Final.pdf

我需要复制到一个单独的目录。文件名前面的数字表示生成文件的运行编号,因此 A) 相互匹配并且 B) 始终为五个字符。然后我需要将其余文件名映射到静态但不同的文件名:

fileA.pdf -> A_File.pdf
SecondFile.pdf -> File_Number_Two.pdf
Final.pdf -> Grand_Finale.pdf

我在想我想要一个 for 循环来浏览文件夹中的 .pdf 文件并选择前导数字的最大值。然后我想取文件名的其余部分,并分别将每个(只有六个)映射到它的目的地。似乎是一个足够简单的批处理过程,但我挂断了。

任何帮助表示赞赏!

4

1 回答 1

0
@ECHO OFF
SETLOCAL
:: Set source and destination directories (can be same...)
SET sourcedir=c:\sourcedir
SET destdir=c:\destdir
FOR /f "delims=" %%i IN ('dir /b /a-d "%sourcedir%\*.pdf" ') DO CALL :moveme "%%i"
GOTO :EOF

:moveme
SET destd=%~1
SET destf=%destd:~5%
SET destd=%destd:~0,5%
IF /i "%destf%"=="filea.pdf" SET destf=A_File.pdf
IF /i "%destf%"=="Secondfile.pdf" SET destf=File_Number_Two.pdf
IF /i "%destf%"=="Final.pdf" SET destf=Grand_Finale.pdf
ECHO MD "%destdir%\%destd%" 2>NUL
ECHO COPY /B "%sourcedir%\%~1" "%destdir%\%destd%\%destf%"
GOTO :eof

这应该做你所要求的。您需要做的就是更改源目录设置和目标目录(这将是要创建的子目录的父目录)

与掩码匹配的每个文件名都由:moveme例程处理。这会将目标文件名设置destf为除前 5 个字符之外的所有字符,并将目录设置为所提供名称的前 5 个字符。

既然您说您想要的名称转换有一个限制列表,那么您需要做的就是跟随其余三个的弹跳球。使/i比较不区分大小写。

最后,创建目录 -2>nul将抑制“目录已存在”消息,并将文件复制到新名称。

请注意,这最后两个操作仅用于控制台 -在您验证命令正常工作后,您ECHO需要删除关键字。ECHO

在命令末尾添加>nul(注意:>nul,不是)可能是个好主意。此处禁止显示“已复制 1 个文件”消息;会抑制任何错误消息...2>nulCOPY>nul2>nul

例程之所以如此命名,moveme是因为我下意识地期望MOVE而不是COPY文件。COPY /B将制作COPY文件(duh),但将原始文件保留在源目录中。替换COPY /BMOVE会将文件从源传输到目标。

于 2013-07-26T18:27:48.323 回答