我有一堆具有以下格式的文件
filename-!#.ext
其中#是递增的数字,以防止发生冲突。我只想删除!从文件名读取为
filename-#.ext
似乎我可以使用ren命令和通配符来做到这一点,但是很难使其工作。我尝试运行此程序:
ren *!?.ext *?.ext
我的想法是*应该与文件名匹配,然后是!,然后是?用于数字。但是,生成的文件名为:
filename-!#.ext.ext
,我不太清楚为什么。
文件名部分可以是动态的,但不包含任何!。有什么想法吗?
答案 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"