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

时间:2018-08-15 15:02:46

标签: batch-file cmd

我有一堆具有以下格式的文件

filename-!#.ext

其中#是递增的数字,以防止发生冲突。我只想删除!从文件名读取为

filename-#.ext

似乎我可以使用ren命令和通配符来做到这一点,但是很难使其工作。我尝试运行此程序:

ren *!?.ext *?.ext

我的想法是*应该与文件名匹配,然后是!,然后是?用于数字。但是,生成的文件名为:

filename-!#.ext.ext

,我不太清楚为什么。

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

3 个答案:

答案 0 :(得分:5)

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

for %%F in (*!*) do (
    set "nxF=%%~nxF"
    call ren "%%nxF%%" "%%nxF:!=%%"
)

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

答案 1 :(得分:4)

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

@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

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

注释

  • 您无法对%%a%0类型的变量使用查找/替换,因此必须首先将其分配给命名变量。

  • 我最初尝试使用for语句(例如,以{{1}结尾的for ... ()进行“内联”,但是要这样做,您必须启用延迟扩展(因为您需要循环访问一个命名变量)。但是,延迟扩展使用)(而不是!)来引用变量,这妨碍了我们尝试删除的%。可能有一种方法可以做到,但是我还没有找到。使用!会稍微慢一些,但除非有成千上万个文件,否则不会显着。

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

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

答案 2 :(得分:3)

根据您提供的信息,并且为了提供一些不同的东西,您可以让延迟扩展为您完成工作,(因为它将为您删除不需要的感叹号) 。!

@For %%A In ("*-!?.ext") Do @Set "_=%%A" & SetLocal EnableDelayedExpansion & Ren "!_!" "%%A" & EndLocal

您可能还可以使用嵌套的for循环来做到这一点:

@For %%A In ("*-!?.ext") Do @For /F "Tokens=1*Delims=!" %%B In ("%%A") Do @Ren "%%A" "%%B%%C"

...以及命令提示符中的

For %A In ("*-!?.ext") Do @For /F "Tokens=1*Delims=!" %B In ("%A") Do @Ren "%A" "%B%C"