2

我在一个文件夹中有一堆文件,我想通过 .bat 或 .vbs 脚本(或类似脚本)复制和重命名它们。这些文件被命名为:

ABC-DE-(XXX)SomeNameHere.dat

我想复制文件并重命名它们,删除 (XXX) 部分,只留下:

ABC-DE-SomeNameHere.dat

这里回答了一种类似的问题,但我无法修改它以适用于上述文件名模式,而且它只是重命名文件,不复制它们。

任何帮助深表感谢!非常感谢。


编辑:在下面发布(可怕的!)代码。可能最好忽略这个;_;

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F"
GOTO :EOF

:process
SET oldname=%1
SET "newname=%~nx1"
SET "newname=%newname:*] =%"
RENAME %oldname% "%newname%"
4

2 回答 2

2

你对自己太苛刻了。你的代码比你想象的更接近。

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F"
GOTO :EOF

:process
SET oldname=%1
SET "newname=%~nx1"
SET "newname=%newname:*)=ABC-DE-%"
RENAME %oldname% "%newname%"

以上可以缩短

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F"
GOTO :EOF

:process
SET "name=%~nx1"
REN %1 "%name:*)=ABC-DE-%"

您可以通过使用延迟扩展来消除对 CALL 的需求

@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR %%F IN ("ABC-DE-(*)*.dat") do (
  SET name=%%~nxF
  REN "%%F" "!name:*)=ABC-DE-!"
)

上面的延迟扩展方案比使用CALL效率更高,但是如果文件名包含会失败,!因为%%F扩展会被延迟扩展破坏。这可以通过在循环中打开和关闭延迟扩展来解决。

@ECHO OFF
FOR %%F IN ("ABC-DE-(*)*.dat") do (
  SET oldName=%%F
  SET newName=%%~nxF
  SETLOCAL EnableDelayedExpansion
  REN "!oldName!" "!newName:*)=ABC-DE-!"
  ENDLOCAL
)
于 2012-04-16T18:50:11.507 回答
0

如果你的文件命名模式是一致的,你可以使用这个:

for /f "tokens=1-3 delims=)(" %%a in ('dir /b') do @rename "%%a(%%b)%%c" "%%a-%%c"
于 2012-04-16T19:09:23.023 回答