Windows批处理脚本从文件名中删除括号中的文本?

标签 windows shell scripting vbscript batch-file

我的文件夹中有一堆文件,我想通过 .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/

相关文章:

java - 打包在 Windows 上运行的 Java 软件的最佳方式是什么?

linux - Unix 切操作

linux - 让 bash 接受函数参数

linux - Bash shell - 按时间顺序统计并显示目录和子目录列表

linux - BASH - 将包含二进制数的文本文件转换为二进制文件

python - celery 任务总是挂起

windows - TCP 打洞

windows - 从 cmd.exe 设置持久环境变量

arrays - csh向数组中添加字符串,空格问题

scripting - WinSCP 以自动化模式向服务器进行身份验证,使用公钥身份验证