有没有办法使用批处理文件从Windows中的文件名中删除特定字符?

时间:2017-02-17 09:14:22

标签: windows batch-file rename filenames

我想重命名包含' ['或者']'通过从这些文件名中删除这两个字符的任何实例来填充字符。

我还没有确定用批处理文件逐个字符读取文件名的方法。

谢谢!

3 个答案:

答案 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

无论您使用何种技术来解决此问题,如果重命名的值与现有文件名冲突,操作可能会失败。