windows - 替换 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
我想解决两个主要限制:
- 它只检查
..\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!"
)
我在这里使用 move ,因为它也适用于完整路径名
- 要解决文件名/路径中的感叹号问题,您需要切换延迟扩展
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
)
推荐阅读
- python - 通过 Python 代码连接 PostgreSQL 数据库
- r - r 对象未打印在文本中
- css - Bootstrap 4.2.1 Flex-box 布局列溢出浏览器边缘
- java - 如何使用 if 语句缩短方法?
- cassandra - 将相同的记录插入具有不同主键的多个表中
- swift - 如何获取编辑 UITextView 的单元格的行号?
- reactjs - React Redux:警告:未知事件处理程序属性在 mapDispatchToProps 中将被忽略
- javascript - 追加 div “n”次,其中“n”是另一个 html div 中的值
- php - 删除列中除字母和单个空格之外的所有内容
- python - 使用 tensorflow 引入了一个新层