当我用来从一组模板文件创建项目文件时,我有一个现有的批处理文件。批处理文件创建文件夹结构,并将一系列文件复制到其中。大多数这些文件都使用相同的结构命名,例如:
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命令时,必须在源文件上指定完整的文件路径,但是只有目标文件上的文件名