我有一堆文件格式如下
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)
我无法弄清楚原因.
文件名部分可以是动态的,但不包含任何!.有任何想法吗?
我认为您必须为此使用一个小批处理文件:
@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命令行上执行替换),但为了清楚起见,我使用了它。
这将适用于所有带有感叹号的文件:它不检查数字之后的位。
我认为rename选择文件并不是一个好主意,而是使用for-loop进行,然后对每个文件执行重命名:
for %%F in (*!*) do (
set "nxF=%%~nxF"
call ren "%%nxF%%" "%%nxF:!=%%"
)
Run Code Online (Sandbox Code Playgroud)
你真的必须在call这里使用而不是delayedExpansion,因为delayedExpansion会破坏重命名参数(因为它们包含!)