Windows 从文件名中批量删除多个Unicode代码(即%20)

Windows 从文件名中批量删除多个Unicode代码(即%20),windows,batch-file,unicode,filenames,batch-rename,Windows,Batch File,Unicode,Filenames,Batch Rename,我经常处理30000-50000个单独文件的文件组,其中许多文件名中包含unicode代码(即%20、%5a、%5b等)。为了正确处理这些文件,我需要用下划线替换这些字符 我有一个脚本,用来一次替换其中一个代码,但是必须运行几个脚本来清理列表,并且总是会遗漏一些 我使用的脚本(以%20为例)如下所示: @echo off setlocal EnableDelayedExpansion for /f "delims=" %%I in ('dir /b ^| find "%20"') do ( s

我经常处理30000-50000个单独文件的文件组,其中许多文件名中包含unicode代码(即%20、%5a、%5b等)。为了正确处理这些文件,我需要用下划线替换这些字符

我有一个脚本,用来一次替换其中一个代码,但是必须运行几个脚本来清理列表,并且总是会遗漏一些

我使用的脚本(以%20为例)如下所示:

@echo off
setlocal EnableDelayedExpansion

for /f "delims=" %%I in ('dir /b ^| find "%20"') do (
set var01=%%I
set var02=!var01:%%5c=_!
call :ren
)
:ren
ren %var01% %var02%
这对每个代码都很好,但我希望能够找到%**来找到所有代码并立即替换它们。这是可以通过一个相当简单的bat来完成的,还是我需要一个更专业的工具

感谢您的帮助

@echo off
setlocal EnableDelayedExpansion
::删除从$
对于($)中的%%b执行/F“delims=”%%a执行('set%%b2^>Nul')执行设置“%%a=”
对于%%a IN(0 1 2 3 4 5 6 7 8 9 a b c d e f)DO(
对于%%b IN(0 1 2 3 4 5 6 7 8 9 a b c d e f)DO(
设置“$%%a%%b=%%%a%%b”
)
)
对于/f“delims=“%%I in('dir/b/a-d^ find“%%”)do(
设置“var1=%%I”
对于/f“tokens=2delims=”%%x IN('set$')DO set“var1=!var1:%%x=!”
如果“%%I”neq“!var1!”ECHO(REN“%%I”!var1!”
)
后藤:EOF
这会解决你的问题


所需的REN命令仅用于测试目的。
ECHO
ed。验证命令正确后,更改
ECHO(REN
REN
以实际重命名文件。

您必须处理所有可能的十六进制编码值,虽然可以通过一些批处理脚本来完成,但检查所有256个值的速度会相当慢。我想您会找到一个第三方重命名工具,它将处理该任务并运行得非常快。@aacini可能会有所帮助如果您的文件名不太长(这会占用环境空间),那么您可以使用非常高效的内存驻留阵列,它工作得非常好,可以提取我在测试目录中遇到的所有代码,在单个文件名中替换多个代码,并且比我的单个替换代码工作得更快。