有什么方法可以使用批处理文件从 Windows 中的文件名中删除特定字符?

Is there any way to remove specific characters from a filename in Windows, using a batch file?

我想重命名目录中包含“[”或“]”字符的每个文件,方法是从这些文件名中删除这两个字符的任何实例。

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

谢谢!

如果您能够使用 PowerShell 并拥有一个包含所有文件的文件夹,您可以 运行 一个命令,如

Dir | Rename-Item -NewName { $_.Name -replace "[","" }

Dir | Rename-Item -NewName { $_.Name -replace "]","" }

去掉字符。

您不需要一个字符一个字符地读取文件名。在批处理中,您可以简单地将变量 %var%%var:subs=repl% 的值中所有出现的子字符串 subs 替换为另一个子字符串 repl。由于删除与用空字符串替换(至少批量)相同,%var:h=% 将从 var 变量的值中删除所有 h。所以你所需要的只是将文件名存储在一个变量中,你可以获得没有 [ and/or ].
的新文件名 要遍历目录中的所有文件,您只需要一个 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 在 中所说,当文件名包含感叹号! 时,延迟扩展可能会导致问题(然后 %%~G 将包含一个 !,它通常宣布一个变量被延迟扩展扩展)。为了解决这个问题,@dbenham 提出了一个很好的解决方案:仅在我们要使用它时启用延迟扩展,即在 FOR 块内,就在使用 filename 变量之前。 ! 不会确定通过延迟扩展扩展的变量的值,因此可以使用 !filename! 而不会在其值中误解 ! 。这也意味着我们必须将 EndLocal 移动到我们在 FOR 块中使用延迟扩展后(即在块的末尾)并避免使用 %%~Gren 命令中。后者可以通过使用变量来保存原始名称(也在启用延迟扩展之前)并使用延迟扩展来检索原始名称来完成。该变量然后可以实际用于构造新文件名。

@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

此外, 指出 IF 实际上是不必要的:使用原始文件名重命名文件不会造成任何伤害。我在我的第二个版本中将其遗漏了(edit-version)。

您可以使用 JREN.BAT - a regular expression renaming command line utility。 JREN.BAT 是纯脚本(混合 batch/JScript),从 XP 开始可以在任何 Windows 机器上本地运行 - 不需要第 3 方 exe。

使用交替,需要转义[

jren "\[|]" ""

或者一个字符集,带有转义 ]

jren "[[\]]" ""

或一个字符集,]作为字符集

的第一个成员
jren "[][]" ""

以上任何语法都可以轻松扩展以去除其他字符。

如果将命令放在批处理脚本中,则必须使用 call jren

无论您使用什么技术来解决这个问题,如果重命名的值与已经存在的文件名冲突,操作都可能会失败。