首页 > 解决方案 > 替换 Windows 文件名中的 URL 字符编码(批处理)

问题描述

我正在尝试用Windows 文件夹及其子文件夹中所有文件名中的相应 ASCII 值替换URL 编码(例如%20,作为空格的占位符) 。

如果有一个简单的.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 是十六进制值。

标签: windowsbatch-fileurlencodebatch-rename

解决方案


  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!"
)

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

  1. 要解决文件名/路径中的感叹号问题,您需要切换延迟扩展
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
)

推荐阅读