我的文件夹中有一堆文件,我想通过 .bat 或 .vbs 脚本(或类似脚本)复制和重命名这些文件。这些文件的命名如下:
ABC-DE-(XXX)SomeNameHere.dat
我想复制文件并重命名它们,删除 (XXX) 部分,只留下:
ABC-DE-SomeNameHere.dat
有一个类似的问题得到了回答 here但我无法修改它以适用于上述文件名模式,而且它只是重命名文件,而不复制它们。
非常感谢任何帮助!非常感谢。
编辑:发布下面的(糟糕!)代码。可能最好忽略这一点;_;
@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%"
最佳答案
你对自己太苛刻了。您的代码比您想象的更接近。
@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
)
关于Windows批处理脚本从文件名中删除括号中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10178524/