码迷,mamicode.com
首页 > 其他好文 > 详细

bat 批处理修改多层文件夹名称

时间:2018-09-15 21:18:34      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:delay   技术分享   默认   inf   bat   方法   命令   系统   nbsp   

最近朋友一直抱怨说有一堆的文件夹需要重新修改名称,一个一个处理非常浪费时间,问有没有什么简洁的方法进行处理。

在明白了朋友的需求后,想到可以写个bat批处理文件进行处理。

首先分析下朋友的需求:

原文件夹名称及结构:D:\

----test01

     ----test02_XXXX_XXXX

         ----test03_XXXX_XXXX

需要将test01文件夹下的test02下划线后的内容去掉,并将文件夹test02下的test03文件夹下划线后面的内容去掉。

修改为:

----test01

     ----test02

         ----test03

明白需求后,发现可以通过获取文件夹的名称,并通过下划线区切文件夹名,并利用bat批处理命令的“ren”进行改名。

处理代码如下:

@echo off&setlocal enabledelayedexpansion
::获取当前路径的文件夹名
for /f %%p in (‘dir /ad/b‘) do (
  set p1=
  set p2=--
  ::输出当前文件夹名称
  echo %%p
  cd %%p
  ::获取当前文件夹下的子文件夹名
  for /f %%a in (‘dir /ad/b‘) do (
    set pathname=%%a
    ::通过"_"区切出当前文件夹名的第一个名称
    for /f "tokens=1 delims=_" %%b in ("!pathname!") do (
      set new_pathname=%%b
    )
    ::更改文件夹名
    ren !pathname! !new_pathname!
    ::输出当前文件夹下的子文件夹名
    echo !p1!!p2!!pathname!
    ::定位到当前文件夹下的子文件夹名
    cd .\!new_pathname!
    ::获取当前文件夹下的子文件夹名
    for /f %%c in (‘dir /ad/b‘) do (
      set pathname2=%%c
      ::输出当前文件夹下的子文件夹名
      echo !p1!!p1!!p1!!p2!!pathname2!
      ::通过"_"区切出当前文件夹名的第一个名称
      for /f "tokens=1 delims=_" %%d in ("!pathname2!") do (
        set new_pathname2=%%d
      )
      ::更改文件夹名
      ren !pathname2! !new_pathname2!
      )
    cd ..
  )
cd ..
)
pause

处理后的结果:
技术分享图片

初步实现了文件夹的名称修改。发给朋友后,朋友在需要修改的路径下进行了测试,发现有部分文件夹名无法修改,原因是文件夹名中有空格,用上述的代码无法处理,见下图:

技术分享图片

原因批处理命令遇到“space”后便把space前后的命令当成两个命令,导致一个文件夹名变成两个,因此提示系统找不到指定文件。

对上述代码进行修改,加入"tokens=* delims="参数,即将bat默认的以space区分修改为不以space区分,修改后的代码如下:

@echo off&setlocal enabledelayedexpansion
::获取当前路径的文件夹名
for /f %%p in (‘dir /ad/b‘) do (
  set p1= 
  set p2=--
  ::输出当前文件夹名称
  echo %%p
  cd %%p
  ::获取当前文件夹下的子文件夹名
  for /f "tokens=* delims=" %%a in (‘dir /ad/b‘) do (
    set pathname=%%a
    ::通过"_"区切出当前文件夹名的第一个名称
    for /f "tokens=1 delims=_" %%b in ("!pathname!") do (
      set new_pathname=%%b
    )
    ::更改文件夹名
    ren "!pathname!" !new_pathname!
    ::输出当前文件夹下的子文件夹名
    echo !p1!!p2!!pathname!
    ::定位到当前文件夹下的子文件夹名
    cd .\!new_pathname!
    ::获取当前文件夹下的子文件夹名
    for /f "tokens=* delims=" %%c in (‘dir /ad/b‘) do (
      set pathname2=%%c
      ::输出当前文件夹下的子文件夹名
      echo !p1!!p1!!p1!!p2!!pathname2!
      ::通过"_"区切出当前文件夹名的第一个名称
      for /f "tokens=1 delims=_" %%d in ("!pathname2!") do (
        set new_pathname2=%%d
      )
      ::更改文件夹名
      ren "!pathname2!" !new_pathname2!
      )
    cd ..
  )
cd ..
)
pause

 执行上述代码,结果如下:

技术分享图片

注意上述代码中“ren”命令中的第一个参数要用“”引起来,否则命令不起作用。

 

bat 批处理修改多层文件夹名称

标签:delay   技术分享   默认   inf   bat   方法   命令   系统   nbsp   

原文地址:https://www.cnblogs.com/mlj001/p/9652203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!