Board logo

标题: REN同时修改多个子目录下文件名的问题 [打印本页]

作者: firstabc     时间: 2010-5-28 20:14    标题: REN同时修改多个子目录下文件名的问题

遇到一个问题,我有很多子目录,比如ab001,ab005,ab113...目录,
ab001目录下有ha0001_00_00.txt,
ab005目录下有ha0012_00_00.txt,
ab113目录下有ha0025_00_00.txt,
......
我想实现这个功能,同时把每个目录下的文件变成
ha????_02_00.txt这种格式的,就是说把主文件名最后几位的
_00_00变成_02_00。
我用下面这个命令来修改,没成功,%var:~n,m%加进去好像也不行。
for /f "delims=" %a in ('dir /s /b /a-d D:\DOS\ren\ha????_00_00.txt') do echo ren "%a" "%~na.txt"
求教高手,怎么改啊?或者还有别的什么方法?
作者: Hanyeguxing     时间: 2010-5-28 22:14
批处理:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /s /b /a-d D:\DOS\*.txt') do (
set a=%%~na
set "a=!a:_00_00=_02_00!"
ren "%%a" "!a!.txt"
)

作者: firstabc     时间: 2010-5-28 23:45
谢谢2楼的,根据2楼的代码做出dat文件是可以的,我想要不用做成dat文件的,直接粘贴到命令窗口就可以跑出来的代码有没有啊?就是说把2楼的代码改在一排,直接拷贝到dos窗口就可以用的。是不是改改%啊,我试了下,没成功,能不能请2楼再帮个忙改改啊?

[ Last edited by firstabc on 2010-5-28 at 23:58 ]
作者: Hanyeguxing     时间: 2010-5-29 01:05
批处理里:
setlocal enabledelayedexpansion&for /f "delims=" %%a in ('dir /s /b /a-d D:\rec\*.txt') do (set a=%%~na&set "a=!a:_00_00=_02_00!"&ren "%%a" "!a!.txt")
cmd或在开始-运行中直接运行:
cmd /q /v:on /k "for /f "delims=" %a in ('dir /s /b /a-d D:\rec\*.txt') do (set a=%~na&set "a=!a:_00_00=_02_00!"&ren "%a" "!a!.txt")"
[ Last edited by Hanyeguxing on 2010-5-30 at 00:46 ]
作者: firstabc     时间: 2010-5-29 01:08
setlocal enabledelayedexpansion&for /f "delims=" %a in ('dir /s /b /a-d D:\DOS\ren\abc\*.txt') do (set a=%~na&set "a=!a:_00_00=_02_00!"&ren "%a" "!a!.txt")

我拷贝这个代码在dos下运行了(xp系统),出来替换成了!a!.txt,是不是!a!不行啊,只能在bat文件里用?


--------------------运行结果1--------------------------------------------
D:\>cd D:\DOS\ren\abc

D:\DOS\ren\abc>for /f "delims=" %a in ('dir /s /b /a-d D:\DOS\ren\abc\*.txt') do
(set a=%~na&set "a=!a:_00_00=_02_00!"&ren "%a" "!a!.txt")

D:\DOS\ren\abc>(set a=ds  & set "a=!a:_00_00=_02_00!"  & ren "D:\DOS\ren\abc\ds.
txt" "!a!.txt" )

D:\DOS\ren\abc>(set a=h0012_00_00  & set "a=!a:_00_00=_02_00!"  & ren "D:\DOS\re
n\abc\ab\h0012_00_00.txt" "!a!.txt" )

D:\DOS\ren\abc>


--------------------运行结果2--------------------------------------------
D:\>cd D:\DOS\ren\abc\

D:\DOS\ren\abc>setlocal enabledelayedexpansion&for /f "delims=" %a in ('dir /s /
b /a-d D:\DOS\ren\abc\*.txt') do (set a=%~na&set "a=!a:_00_00=_02_00!"&ren "%a"
"!a!.txt")

D:\DOS\ren\abc>(set a=!a!  & set "a=!a:_00_00=_02_00!"  & ren "D:\DOS\ren\abc\!a
!.txt" "!a!.txt" )

D:\DOS\ren\abc>(set a=!a!  & set "a=!a:_00_00=_02_00!"  & ren "D:\DOS\ren\abc\ab
\!a!.txt" "!a!.txt" )

D:\DOS\ren\abc>

[ Last edited by firstabc on 2010-5-29 at 01:28 ]
作者: Hanyeguxing     时间: 2010-5-29 16:59
重新运行
cmd /q /v:on /k "for /f "delims=" %a in ('dir /s /b /a-d D:\rec\*.txt') do (set a=%~na&set "a=!a:_00_00=_02_00!"&ren "%a" "!a!.txt")"
[ Last edited by Hanyeguxing on 2010-5-30 at 00:47 ]
作者: firstabc     时间: 2010-5-29 20:46
不要前面的cmd /q /v:on /k 不行吗,直接把以for开头的代码拷贝到黑屏里运行的代码不能实现吗?
作者: Hanyeguxing     时间: 2010-5-30 00:54
不可以!
1,在脚本或批处理文件外使用 setlocal 时,将没有效果。所以在cmd窗口内是不能使用setlocal enabledelayedexpansion来开启变量延迟。
2,因此,就要使用cmd /q /v:on /k 来开启变量延迟,其中/q关闭回显,/v开关变量延迟,/k在这里也可以写成/c。
作者: firstabc     时间: 2010-6-1 21:55
那就用Hanyeguxing的批文件吧,谢谢你了!可以揭贴了。