我想重命名包含' ['或者']'通过从这些文件名中删除这两个字符的任何实例来填充字符。
我还没有确定用批处理文件逐个字符读取文件名的方法。
谢谢!
答案 0 :(得分:4)
您不需要逐个字符地读取文件名。在批处理中,您可以使用subs
将变量repl
的值中的所有子串%var%
替换为另一个子串%var:subs=repl%
。由于删除与使用空字符串替换相同(至少在批处理中),%var:h=%
将从h
变量的值中删除所有var
s。因此,您只需将文件名存储在变量中,即可获得不带[
和/或]
的新文件名。
要迭代目录中的所有文件,您只需要FOR
循环。
因此,您可以迭代当前目录中的所有文件,并使用以下脚本重命名其名称中包含[
或]
的文件(或两者)(请参阅编辑同时处理名称的版本带惊叹号):
@echo off
Setlocal EnableDelayedExpansion
FOR %%G IN (*) DO (
set "filename=%%~G"
set "filename=!filename:[=!"
set "filename=!filename:]=!"
REM Rename only if there is a difference between new filename and old filename in %%G
IF NOT "!filename!" == "%%~G" ren "%%~G" "!filename!"
)
EndLocal
exit /b 0
由于filename
块中设置了FOR
变量,我们希望在同一块内读取它,我们需要delayed expansion。
编辑:正如@dbenham在comment中所说,当您的文件名包含感叹号!
时,延迟展开会导致问题({{然后,将包含一个%%~G
,它通常会宣布一个扩展的扩展变量。为了解决这个问题,@ dbenham提出了一个很好的解决方案:只有当我们即将使用它时,即在使用!
变量之前FOR
块内,才启用延迟扩展。 filename
不会影响使用延迟扩展扩展的变量的值,因此可以使用!
而不会在其值中错误解释!filename!
。这也意味着我们必须在使用!
块中的延迟扩展(即块的末尾)完成之后移动EndLocal
并避免使用FOR
在%%~G
命令中。后者可以通过使用变量来保存原始名称(也在启用延迟扩展之前)并使用延迟扩展来检索原始名称来完成。然后,该变量实际上可用于构造新文件名。
ren
此外,@KlitosKyriacou指出@echo off
FOR %%G IN (*) DO (
REM Set filename without delayed expansion, no misinterpreted '!' possible
set "old_filename=%%~G"
REM before using old_filename, enable delayed expansion
SetLocal EnableDelayedExpansion
set "new_filename=!old_filename:[=!"
set "new_filename=!new_filename:]=!"
REM Rename only if there is a difference between new filename and old filename in %%G
ren "!old_filename!" "!new_filename!"
REM No more delayed expansion needed in block now
EndLocal
)
exit /b 0
实际上是不必要的:使用原始文件名重命名文件不会造成任何伤害。我把它留在我的第二个版本(编辑版)中。
答案 1 :(得分:2)
如果您能够使用 PowerShell 并拥有一个所有文件所在的文件夹,则可以运行类似
的命令Dir | Rename-Item -NewName { $_.Name -replace "[","" }
和
Dir | Rename-Item -NewName { $_.Name -replace "]","" }
摆脱角色。
答案 2 :(得分:2)
您可以使用JREN.BAT - a regular expression renaming command line utility。 JREN.BAT是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe。
使用交替,需要转义[
jren "\[|]" ""
或带有转义]
jren "[[\]]" ""
或字符集,]
作为集
jren "[][]" ""
上述任何语法都可以轻松扩展以删除其他字符。
如果将命令放在批处理脚本中,则必须使用call jren
。
无论您使用何种技术来解决此问题,如果重命名的值与现有文件名冲突,操作可能会失败。