替换 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
我想解决两个主要限制:
- 它只检查
..\Music\
文件夹根目录。我想看看
子目录中的文件。
- 一旦执行其中一个重命名,它就会退出
For
循环
(例如,所有 %20
都替换了第一遍,但没有别的)。
并且肯定有更好的方法来指定编码及其替换(而不是每个变量对),但这是一个很好的功能。
这些编码总是采用 %XX
的形式,其中 X 是十六进制值。
- 要解决目录递归搜索问题,您可以使用
dir /s /b
代替
FOR /F "delims=" %%# in ('dir /s /b "D:\Dropbox\Music\*.mp3"') Do (
...
)
- 任何时候都不要重命名文件,只有在所有替换之后才可以
FOR /F "delims=" %%# in ('dir /s /b "D:\Dropbox\Music\*.mp3"') Do (
set "file=%%~#"
set "file="!File:%%20= !"
set "file="!File:%%28=(!"
...
move "%%~#" "!file!"
)
我在这里使用移动,因为它也适用于完整路径名
- 要解决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
)
我正在尝试用 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
我想解决两个主要限制:
- 它只检查
..\Music\
文件夹根目录。我想看看 子目录中的文件。 - 一旦执行其中一个重命名,它就会退出
For
循环 (例如,所有%20
都替换了第一遍,但没有别的)。
并且肯定有更好的方法来指定编码及其替换(而不是每个变量对),但这是一个很好的功能。
这些编码总是采用 %XX
的形式,其中 X 是十六进制值。
- 要解决目录递归搜索问题,您可以使用
dir /s /b
代替
FOR /F "delims=" %%# in ('dir /s /b "D:\Dropbox\Music\*.mp3"') Do (
...
)
- 任何时候都不要重命名文件,只有在所有替换之后才可以
FOR /F "delims=" %%# in ('dir /s /b "D:\Dropbox\Music\*.mp3"') Do (
set "file=%%~#"
set "file="!File:%%20= !"
set "file="!File:%%28=(!"
...
move "%%~#" "!file!"
)
我在这里使用移动,因为它也适用于完整路径名
- 要解决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
)