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



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

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%返回具有任意位数的项目编号

%%~nf返回在上操作的文件的文件名

%%~xf返回在上操作的文件的扩展名

我最初也尝试使用%%~df和%%~pf来检索新文件名的驱动器和路径组件,但TIL表示,在使用rename命令时,必须在源文件上指定完整的文件路径,但只能在目标文件上指定文件名

最新更新