0

我有一堆文件,我想删除所有不在字母表中的字符。所以给定一个“Home - noises (f).txt”的文件名,我想要一个“Home noises f.txt”的结果。批处理文件在同一个文件夹中,它不需要递归。这就是我目前所拥有的:

@echo ON
SETLOCAL EnableDelayedExpansion
For %%# in (*.*) do (
    Set MyVar=%%~n#
    set MyVar=!MyVar:"-"= !
    REN "%%~n#" "!MyVar!"
    set MyVar=!MyVar:"("= !
    REN "%%~n#" "!MyVar!"
    set MyVar=!MyVar:")"= !
    REN "%%~n#" "!MyVar!"
    echo %%~n#>>text.txt
)
Pause&Exit
4

3 回答 3

1
@echo off
setlocal EnableDelayedExpansion
set preserve=abcdefghijklmnopqrstuvwxyz 1234567890
for %%a in (*.*) do (
   set "filename=%%~Na"
   call :RemoveChars filename newFilename=
   if "!newFilename!" neq "%%~Na" ren "%%a" "!newFilename!%%~Xa"
)
goto :EOF


:RemoveChars filename newFilename=
set %2=
:nextChar
   set "char=!%1:~0,1!"
   if "!preserve:%char%=!" neq "%preserve%" set "%2=!%2!%char%"
   set "%1=!%1:~1!"
if defined %1 goto nextChar
exit /B

下面的版本将比以前的版本运行得快得多,但需要进行多次修改才能管理字符串中的某些特殊字符remove

@echo off
setlocal EnableDelayedExpansion
set remove=@#$()[]
for %%a in (*.*) do (
   set "filename=%%~Na"
   call :RemoveChars filename newFilename=
   if "!newFilename!" neq "%%~Na" ren "%%a" "!newFilename!%%~Xa"
)
goto :EOF


:RemoveChars filename newFilename=
set "%2=!%1!"
set "remove2=!remove!"
:nextChar
   set "char=!remove2:~0,1!"
   set "%2=!%2:%char%=!"
   set "remove2=!remove2:~1!"
if defined remove2 goto nextChar
exit /B
于 2013-05-20T03:39:58.360 回答
0

或者,使用renamer你可以运行:

$ renamer --regex --find '\W' *
于 2013-10-05T08:49:00.377 回答
0

这真的很好用。是否有人能够将此代码集成到上层解决方案中,以便在删除其他特殊字符之前先替换德语变音符号?ä -> ae ü -> ue ö -> oe ß -> ss

我发现了这个:
`

@echo off      
SET VARX=%1%      
SET VARX=%VARX:„=ae%      
SET VARX=%VARX:”=oe%      
SET VARX=%VARX:=ue%      
SET VARX=%VARX:á=ss%      
ECHO %VARX%      
SET VARX=      
pause 

`

于 2013-11-20T17:26:27.763 回答