Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换Windows文件名中的URL字符编码(批处理)_Windows_Batch File_Urlencode_Batch Rename - Fatal编程技术网

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

替换Windows文件名中的URL字符编码(批处理),windows,batch-file,urlencode,batch-rename,Windows,Batch File,Urlencode,Batch Rename,我试图在Windows文件夹及其子文件夹中的所有文件名中用相应的ASCII值替换(例如,%20作为空格的占位符) 如果您有一个简单的.bat文件可以完成此任务,但它有一些限制: @echo off Setlocal enabledelayedexpansion Set "Pattern0=%%20" Set "Replace0= " Set "Pattern1=%%27" Set "Replace1='" Se

我试图在Windows文件夹及其子文件夹中的所有文件名中用相应的ASCII值替换(例如,
%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
  • 任何时候都不要重命名该文件,只能在所有替换之后重命名
  • 我在这里使用move,因为它也适用于完整路径名

  • 要解决文件名/路径中的感叹号问题,需要切换延迟扩展

  • 谢谢看来我剩下的唯一一步就是手动填写具体的重命名,是吗?例如,下一行可能是
    set“file=”!文件:%%29=)!“
    --等等?如果是这样,我想知道是否有一种方法可以避免任何/每个ASCII编码(源自URL编码)使用一行代码?同样,我们知道要匹配的值的格式总是
    %HH
    ,其中H=十六进制字符。@DerekClark是的,只添加缺少的替换项。您也可以搜索百分号,获取接下来的两个字符并转换它们,但这并不是很重要,再次感谢您。我熟悉r的惯例正则表达式,但请注意,在处理Windows脚本时,知识可能无法很好地传递
    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!"
    )
    
    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
    )