【问题标题】:Windows batch script which removes text in brackets from filenames?Windows批处理脚本从文件名中删除括号中的文本?
【发布时间】:2012-04-28 01:01:20
【问题描述】:

我在一个文件夹中有一堆文件,我想通过 .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%"

【问题讨论】:

  • 向我们展示您编写的代码并告诉我们您遇到了什么错误......然后我们可以帮助您使其正常工作。
  • @aphoria 完成了,但它非常没用。我的批处理脚本知识非常基础。

标签: windows shell scripting vbscript batch-file


【解决方案1】:

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

@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
)

【讨论】:

    【解决方案2】:

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

    for /f "tokens=1-3 delims=)(" %%a in ('dir /b') do @rename "%%a(%%b)%%c" "%%a-%%c"
    

    【讨论】:

    • 1) 使用 "tokens=12*" 更安全 2) 使用 'dir /b "ABC-DE-(\*)\*.dat"' 3) 从 rename 命令的最后一个参数中删除 -
    • 嗯。 1) 不同意。如果您知道解析后的原始字符串将变成三个变量,则不确定为什么这样做更安全。使其过于复杂。 2) 不同意。对于生产来说还可以——但对于概念来说,它会变得不必要地复杂。 3) 同意 - 我将它用于我的测试以提高可读性,应该删除它。
    • 第 1 点 - 如果您使用 "tokens=1-3" 并且文件名恰好包含两个或更多括号对,则文件名的一部分将被截断。我意识到您以“如果您的文件命名模式一致”作为解决方案的开头。但是,如果意外地在具有多个括号的文件上运行,则危害较小。而且我看不出“tokens=12*”比“tokens=1-3”更复杂吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2023-04-02
    相关资源
    最近更新 更多