使用批处理文件将任意长度的前缀应用于文件目录

Apply a prefix of arbitrary length to a directory of files with batch file

我在使用一组模板文件创建项目文件时有一个现有的批处理文件。批处理文件创建一个文件夹结构,并将一系列文件复制到其中。大多数这些文件都使用相同的结构命名,例如:

PPPP-123_456a.dwg

我的批处理文件当前使用以下行将“PPPP”替换为实际项目编号:

for /r "%ProjDir%" %%f in (PPPP*) do (rename "%%f" "%ProjectNumber%*")

其中 ProjDir 是批处理文件创建的文件夹路径,ProjectNumber 是项目编号。

效果很好。我的问题是一些客户项目编号现在高达 5 位数,而其他项目编号为 4 位数。我需要修改此行才能正确处理 4 位或 5 位项目编号。

我尝试过的事情:

如果我按原样使用项目编号 12345,我的文件名将从 PPPP-123_456a.dwg 更改为 12345123_456a.dwg - 而不是插入额外的字符,重命名命令只是覆盖现有字符,所以我丢失了文件名中的第一个破折号。

如果我将所有模板文件重命名为以 PPPPP 开头,那么我将无法在四位数的项目编号上使用它,否则结果将是 1234P-123_456a.dwg.

如果我从模板文件中删除所有前导 P,然后将代码修改为:

for /r "%ProjDir%" %%f in (PPPP*) do (rename "%%f" "%ProjectNumber%%%f")

…然后它尝试将项目编号前缀应用于文件路径的开头,而不是文件名(即它尝试将 C:/Test/-123_456a.dwg 重命名为 12345C:/Test-123_456a.dwg).这似乎是我迄今为止最接近的尝试,我只需要找到一种方法让它将前缀应用于字符串的文件名部分,而不是整个字符串。但是我不知道该怎么做。

TL;DR,如何使用批处理文件将任意长度的前缀正确应用到文件目录?

问题出在 rename 命令上,当使用 prefix* 作为新名称时,它会替换 prefix 中包含的尽可能多的字符。所以你需要自己建立新名称而不是让 rename 尝试这样做:

rem /* Walk through the project directory tree and search for all files whose names
rem    match a template with either a 4-digit or a 5-digit project number prefix: */
for /R "%ProjDir%" %%F in ("PPPP-*.*" "PPPPP-*.*") do (
    rem // Split the pure file name at the first hyphen to get the prefix and the rest:
    for /F "tokens=1* delims=-" %%I in ("%%~nxF") do (
        rem // Build the new file name by replacing the prefix by the project number:
        rename "%%F" "%ProjectNumber%-%%J"
    )
)

抱歉无线电静音,被叫去执行更紧急的项目。

我设法通过从每个文件的开头删除 PPPP 来稍微简化事情,然后按照@aschipfl 的建议构建新文件名。这也允许我对少数不遵循与上述相同文件名结构的其他文件使用相同的技术。

for /r "%ProjDir%" %%f in (*.dwg) do (rename %%f %ProjectNumber%%%~nf%%~xf)

%ProjectNumber% returns 任意位数的项目编号

%%~nf returns正在操作的文件的文件名

%%~xf returns正在操作的文件的扩展名

我最初也尝试过使用 %%~df 和 %%~pf 来检索新文件名的驱动器和路径部分,但是直到使用重命名命令时,您必须在源文件,但只有目标文件上的文件名