使用Windows ren命令删除!从文件名

use*_*986 4 cmd batch-file

我有一堆文件格式如下

filename-!#.ext
Run Code Online (Sandbox Code Playgroud)

其中#是一个递增的数字,以防止碰撞.我想删除!从文件名中读取为

filename-#.ext
Run Code Online (Sandbox Code Playgroud)

似乎我可以使用ren命令和通配符执行此操作,但很难让它工作.我试过这个:

ren *!?.ext *?.ext
Run Code Online (Sandbox Code Playgroud)

我的想法是*应该匹配文件名 - 部分,然后!,然后是?对于数字.但是,生成的文件名为:

filename-!#.ext.ext
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚原因.

文件名部分可以是动态的,但不包含任何!.有任何想法吗?

Tri*_*und 6

我认为您必须为此使用一个小批处理文件:

@echo off
    setlocal
    for %%a in (*!*.ext) do call :remove "%%~a"
    goto :eof

:remove
    set "FROM=%~1"
    set "TO=%FROM:!=%"
    ren "%FROM%" "%TO%"
    goto :eof
Run Code Online (Sandbox Code Playgroud)

以上将 - 对于所有包含感叹号和扩展名的文件ext- 调用该remove函数。这将采用原始名称 ( FROM) 并TO通过使用%var:find=replace%删除任何感叹号的语法(将其替换为空字符串)来确定新名称 ( )。

笔记

  • 您不能使用 find/replace%%a%0type 变量,因此您必须先将其分配给命名变量。

  • 我最初尝试使用for语句(例如for ... (结尾))执行此“内联”操作,但要做到这一点,您必须启用延迟扩展(因为您需要在循环中访问命名变量)。然而,延迟扩展使用!(而不是%)来引用变量,这妨碍了!我们试图删除的方式。可能有一种方法可以做到这一点,但我还没有找到。使用call会稍微慢一些,但不会显着,除非您有数千个文件。

  • 您实际上并不需要创建TO(您可以在ren命令行上执行替换),但为了清楚起见,我使用了它。

  • 这将适用于所有带有感叹号的文件:它不检查数字之后的位。


tim*_*g07 5

我认为rename选择文件并不是一个好主意,而是使用for-loop进行,然后对每个文件执行重命名:

for %%F in (*!*) do (
    set "nxF=%%~nxF"
    call ren "%%nxF%%" "%%nxF:!=%%"
)
Run Code Online (Sandbox Code Playgroud)

你真的必须在call这里使用而不是delayedExpansion,因为delayedExpansion会破坏重命名参数(因为它们包含!)

  • 你打败了我.但你可以用一个"CALL"来做到这一点.只需要替换并同时重命名:`call ren"%% F""%% newF:!= %%"` (2认同)