Board logo

标题: [文件操作] 求一个批量修改文件名和文件夹的批处理 [打印本页]

作者: 1220426    时间: 2011-6-18 11:48     标题: 求一个批量修改文件名和文件夹的批处理

我要重命名所有分区上带有 印刷这两个字的文件,(有文件也有文件夹而且名字中文名字很长,比如深圳印刷.exe    改为深圳电子.exe 。) 请高手给我来一段吧。
作者: 1220426    时间: 2011-6-18 12:04

是我的问题描述得不清楚还是怎么哦。  比如 硬盘上 有很多   文件名为 某某印刷   XXX印刷的文件夹,和某某印刷.exe    XXX印刷.exe   的文件,我只想把文件中带有印刷两个字的改成电子   如:某某电子   XXX电子  某电子.exe    XXX电子.exe
作者: CrLf    时间: 2011-6-18 13:09

  1. cmd /q /v:on /c for /f "delims=" %%a in ('dir /s /a /b *印刷.*') do set "tmp=%%~nxa"^&ren "%%a" "!tmp:印刷=电子!"
复制代码

作者: tmplinshi    时间: 2011-6-18 14:59

本帖最后由 tmplinshi 于 2011-6-18 15:14 编辑
  1. @echo off
  2. setlocal disabledelayedexpansion
  3. set "str_old=印刷"
  4. set "str_new=电子"
  5. set "drive=c d e f g h i j k l m n o p q r s t u v w x y z"
  6. for %%d in (%drive%) do (
  7.     if exist %%d: (
  8.         echo 正在处理 %%d 盘...
  9.         for /f "delims=" %%f in (' dir /a /b /s "%%d:\*%str_old%*" ') do (
  10.             set fpath=%%~dpf
  11.             set fname=%%~nxf
  12.             setlocal enabledelayedexpansion
  13.             set "fpath=!fpath:%str_old%=%str_new%!"
  14.             set "fname_new=!fname:%str_old%=%str_new%!"
  15.             ren "!fpath!!fname!" "!fname_new!" || (
  16.                 rem 为了处理“隐藏”和“系统”属性的文件(夹)
  17.                 for %%f in ("!fpath!!fname!") do (
  18.                     set a=%%~af
  19.                     if "!a:h=!" neq "!a!" set a=!a! -h
  20.                     if "!a:s=!" neq "!a!" set a=!a! -s
  21.                     set a=!a:* =!
  22.                     attrib !a! "!fpath!!fname!"
  23.                     ren "!fpath!!fname!" "!fname_new!"
  24.                     attrib !a:-=+! "!fpath!!fname_new!"
  25.                 )
  26.             )
  27.             endlocal
  28.         )
  29.     )
  30. ) 2>nul
  31. pause
复制代码

作者: tmplinshi    时间: 2011-6-18 15:05

本帖最后由 tmplinshi 于 2011-6-18 15:15 编辑
cmd /q /vn /c for /f "delims=" %%a in ('dir /s /a /b *印刷.*') do set "tmp=%%~nxa"^&ren "%%a" "!tmp:印刷=电子!"
zm900612 发表于 2011-6-18 13:09

存在好多问题:

1. 最主要的问题是,如果路径是:
    c:\印刷
    c:\印刷\印刷2.txt
把“c:\印刷”变成“c:\电子”后,“c:\印刷\印刷2.txt”就不存在了。

2. 没有处理所有分区。

3. dir /a 列出了所有属性的文件(夹),而 ren 不能重命名含有“隐藏”和“系统”属性的文件(夹)。

4. 没有处理半角感叹号。

5. “dir /s /a /b *印刷.*”,文件名不一定有“.”。
作者: CrLf    时间: 2011-6-18 15:57

5# tmplinshi

第一个问题不存在,因为我用的是:set "tmp=%%~nxa"
其他问题确实存在
作者: CrLf    时间: 2011-6-18 16:12

本帖最后由 zm900612 于 2011-6-18 17:44 编辑

由于attrib效率非常低,所以这里只简单把所有带印刷二字的文件、文件夹去除隐藏属性,就不还原了
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in ('mountvol^|findstr :\') do (
  3.         if exist %%anul set dircmd=!dircmd!;%%a*印刷*
  4.         attrib /s /d -s -h %%a*印刷*
  5. )
  6. for /f "delims=" %%a in ('dir /s /b') do (
  7.         endlocal
  8.         set "tmp=%%~nxa"
  9.         set f="%%~dpa"
  10.         setlocal enabledelayedexpansion
  11.         ren "!f:印刷=电子!%%nxa" "!tmp:印刷=电子!"
  12. )
复制代码
已修正
作者: tmplinshi    时间: 2011-6-18 16:19

本帖最后由 tmplinshi 于 2011-6-18 16:25 编辑
5# tmplinshi  

第一个问题不存在,因为我用的是:set "tmp=%%~nxa"
其他问题确实存在
zm900612 发表于 2011-6-18 15:57


存在的。

c:\印刷
c:\印刷\印刷2.txt

c:\印刷 → c:\电子
c:\印刷\印刷2.txt → c:\印刷\电子2.txt (这一步就会出错,因为“c:\印刷”已经在上一次重命名时,改成了“c:\电子”。)
作者: CrLf    时间: 2011-6-18 16:23

本帖最后由 zm900612 于 2011-6-18 16:27 编辑

哦,原来指的是这个啊。。。。
已修正
作者: tmplinshi    时间: 2011-6-18 16:57

本帖最后由 tmplinshi 于 2011-6-18 17:00 编辑
for /f "delims=" %%a in ('dir /s /a-d /b^&dir /s /ad /b') do (
        endlocal
        set "tmp=%%~nxa"
        set f="%%~sa"
        setlocal enabledelayedexpansion
        ren "!f!" "!tmp:印刷=电子!"
)
zm900612 发表于 2011-6-18 16:12


仍然会出错:

...前面的文件处理正确。下面开始是目录...
c:\印刷
c:\印刷\1\印刷

作者: CrLf    时间: 2011-6-18 17:18

ok,又改了,这回应该没错
作者: 1220426    时间: 2011-6-18 18:12

太崇拜版主了,以及各位参加研究的朋友,很好用。谢谢你们了。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2