替换 Windows 个文件名中的 URL 个字符编码(批量)

Replace URL Character Encodings In Windows Filenames (Batch)

我正在尝试用 all 中相应的 ASCII 值替换 URL encodings(例如 %20 作为 space 的占位符) Windows 文件夹及其子文件夹中的文件名。

如果有一个简单的 .bat 文件可以完成此操作,但它有局限性:

@echo off
Setlocal enabledelayedexpansion

Set "Pattern0=%%20"
Set "Replace0= "

Set "Pattern1=%%27"
Set "Replace1='"

Set "Pattern2=%%28"
Set "Replace2=("

Set "Pattern3=%%29"
Set "Replace3=)"

Set "Pattern4=%%5B"
Set "Replace4={"

Set "Pattern5=%%5D"
Set "Replace5=}"

For %%# in ("D:\Dropbox\Music\*.mp3") Do (
    Set "File=%%~nx#"
    Ren "%%#" "!File:%Pattern0%=%Replace0%!"
    Ren "%%#" "!File:%Pattern1%=%Replace1%!"
    Ren "%%#" "!File:%Pattern2%=%Replace2%!"
    Ren "%%#" "!File:%Pattern3%=%Replace3%!"
    Ren "%%#" "!File:%Pattern4%=%Replace4%!"
    Ren "%%#" "!File:%Pattern5%=%Replace5%!"
)

Pause&Exit

我想解决两个主要限制:

  1. 它只检查 ..\Music\ 文件夹根目录。我想看看 子目录中的文件。
  2. 一旦执行其中一个重命名,它就会退出 For 循环 (例如,所有 %20 都替换了第一遍,但没有别的)。

并且肯定有更好的方法来指定编码及其替换(而不是每个变量对),但这是一个很好的功能。

这些编码总是采用 %XX 的形式,其中 X 是十六进制值。

  1. 要解决目录递归搜索问题,您可以使用dir /s /b代替
FOR /F "delims=" %%# in ('dir /s /b "D:\Dropbox\Music\*.mp3"') Do (
...
)
  1. 任何时候都不要重命名文件,只有在所有替换之后才可以
FOR /F "delims=" %%# in ('dir /s /b "D:\Dropbox\Music\*.mp3"') Do (
   set "file=%%~#"
   set "file="!File:%%20= !"
   set "file="!File:%%28=(!"
   ...
   move "%%~#" "!file!"
)

我在这里使用移动,因为它也适用于完整路径名

  1. 要解决filenames/paths中带有感叹号的问题,您需要切换延迟展开
setlocal DisableDelayedExpansion
FOR /F "delims=" %%# in ('dir /s /b "D:\Dropbox\Music\*.mp3"') Do (
   set "file=%%~#"

   setlocal EnableDelayedExpansion
   set "file="!File:%%20= !"
   set "file="!File:%%28=(!"
   ...
   move "%%~#" "!file!"
   endlocal
)