有什么方法可以使用批处理文件从 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
块中使用延迟扩展后(即在块的末尾)并避免使用 %%~G
在 ren
命令中。后者可以通过使用变量来保存原始名称(也在启用延迟扩展之前)并使用延迟扩展来检索原始名称来完成。该变量然后可以实际用于构造新文件名。
@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
。
无论您使用什么技术来解决这个问题,如果重命名的值与已经存在的文件名冲突,操作都可能会失败。
我想重命名目录中包含“[”或“]”字符的每个文件,方法是从这些文件名中删除这两个字符的任何实例。
我还没有确定使用批处理文件逐字符读取文件名的方法。
谢谢!
如果您能够使用 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
块中使用延迟扩展后(即在块的末尾)并避免使用 %%~G
在 ren
命令中。后者可以通过使用变量来保存原始名称(也在启用延迟扩展之前)并使用延迟扩展来检索原始名称来完成。该变量然后可以实际用于构造新文件名。
@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
。
无论您使用什么技术来解决这个问题,如果重命名的值与已经存在的文件名冲突,操作都可能会失败。