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

时间:2019-01-23 22:48:09

标签: batch-file batch-rename

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

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,如何使用批处理文件正确地将任意长度的前缀应用于文件目录?

2 个答案:

答案 0 :(得分:2)

问题是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"
    )
)

答案 1 :(得分:0)

对无线电沉默的道歉,被迫取消了一个更紧急的项目。

我设法通过从每个文件的开头删除PPPP来稍微简化一些事情,然后按照@aschipfl的建议仅构建新的文件名。这也使我可以对少数其他文件使用与上面相同的文件名结构。

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

%ProjectNumber%返回带有任意数字的项目编号

%%〜nf返回正在操作的文件的文件名

%%〜xf返回正在操作的文件的扩展名

我最初还尝试使用%%〜df和%%〜pf来检索新文件名的驱动器和路径组件,但是请注意,在使用重命名命令时,必须在源文件上指定完整的文件路径文件,但只有目标文件上的文件名