标题: [文件操作] 求一个批量修改文件名和文件夹的批处理 [打印本页]
作者: 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
- 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 编辑
- @echo off
- setlocal disabledelayedexpansion
-
- set "str_old=印刷"
- set "str_new=电子"
- 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"
-
- for %%d in (%drive%) do (
- if exist %%d: (
- echo 正在处理 %%d 盘...
- for /f "delims=" %%f in (' dir /a /b /s "%%d:\*%str_old%*" ') do (
- set fpath=%%~dpf
- set fname=%%~nxf
- setlocal enabledelayedexpansion
- set "fpath=!fpath:%str_old%=%str_new%!"
- set "fname_new=!fname:%str_old%=%str_new%!"
- ren "!fpath!!fname!" "!fname_new!" || (
- rem 为了处理“隐藏”和“系统”属性的文件(夹)
- for %%f in ("!fpath!!fname!") do (
- set a=%%~af
- if "!a:h=!" neq "!a!" set a=!a! -h
- if "!a:s=!" neq "!a!" set a=!a! -s
- set a=!a:* =!
- attrib !a! "!fpath!!fname!"
- ren "!fpath!!fname!" "!fname_new!"
- attrib !a:-=+! "!fpath!!fname_new!"
- )
- )
- endlocal
- )
- )
- ) 2>nul
-
- 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效率非常低,所以这里只简单把所有带印刷二字的文件、文件夹去除隐藏属性,就不还原了- @echo off&setlocal enabledelayedexpansion
- for /f %%a in ('mountvol^|findstr :\') do (
- if exist %%anul set dircmd=!dircmd!;%%a*印刷*
- attrib /s /d -s -h %%a*印刷*
- )
- for /f "delims=" %%a in ('dir /s /b') do (
- endlocal
- set "tmp=%%~nxa"
- set f="%%~dpa"
- setlocal enabledelayedexpansion
- ren "!f:印刷=电子!%%nxa" "!tmp:印刷=电子!"
- )
复制代码
已修正
作者: 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:\电子
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://www.bathome.net/) |
Powered by Discuz! 7.2 |