在Windows中批量删除文件名中的特殊字符

在Windows中批量删除文件名中的特殊字符

我对批处理脚本还很陌生。

有针对此问题的解决方案Linux 和 macOS,但我需要它用于 Windows。

我有以下内容,它只对特殊字符 !@#$%^&*~ 等有效,基本上就是您在键盘上看到的字符。 但我需要删除 Â 和 ° 等特殊字符。以下脚本对这两个特定字符不起作用。,我可以通过 cmd 运行脚本。但它与 winows7 cmd 不兼容。

@echo off &setlocal
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *#*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:#=!"
    ren "!fname!" "!nname!"
    endlocal
)

以下只能删除文件名中的空格

@echo off
setlocal disableDelayedExpansion
if /i "%~1"=="/R" (
  set "forOption=%~1 %2"
  set "inPath="
) else (
  set "forOption="
  if "%~1" neq "" (set "inPath=%~1\") else set "inPath="
)
for %forOption% %%F in ("%inPath%* *") do (
  if /i "%~f0" neq "%%~fF" (
    set "folder=%%~dpF"
    set "file=%%~nxF"
    setlocal enableDelayedExpansion
    echo ren "!folder!!file!" "!file: =!"
    ren "!folder!!file!" "!file: =!"
    endlocal
  )
)

答案1

如果您考虑到脚本必须使用代码页 437,那么您的第一个脚本对我来说就有效了。

将以下脚本粘贴到记事本中。使用 ANSI 编码保存为 test.bat。

@echo off &setlocal
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *ø*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:ø=!"
    ren "!fname!" "!nname!"
    endlocal
)

上述脚本将重命名degree°.txtdegree.txt

使用 ø 是因为它是 Unicode U+00F8。度数符号位于0xF8代码页 437 中。

 未出现在代码页 437 中,因此我不知道是否有并行解决方案。可能需要按照此答案的指示更改代码页才能正确执行。以下是包含更改代码页的批处理文件的尝试。

echo Ignore the error displayed below
@echo off &setlocal
chcp 65001>nul
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *Â*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:Â=!"
    ren "!fname!" "!nname!"
    endlocal
)

将以上内容粘贴到记事本文件中,并使用 UTF-8 编码保存。必须包含脚本的第一行,因为批处理文件在最初处理 UTF-8 文件时会出错。

答案2

我希望我能为此承担责任,但这是我偶然发现的。我找不到我找到它的帖子,所以这是凭记忆写的。

find . -depth -name "*" -print0 | $var -0 sed -i 's/[:cntrl:]/_/g' *

您可能需要稍微尝试一下,我只是从我的一个项目中抽出几分钟来发布此内容。请分享您的结果。

相关内容