bat批量替换特定字符文件名称

比如目录及子目录下有A_B.TXT,AA_B.TXT,批量将文件名中的B改为C,怎么做呢?谢谢!

@echo off
title 文件名字符替换
mode con cols=60 lines=20
::文件要是重名,会提示错误。
setlocal EnableDelayedExpansion & color 0a
:1
set a=
set b=
set c=
cls&echo.
set /p a= 请输入要被替换的字符:
cls&echo.
set /p b= 请输入替换“!a!”的字符,若要去掉“!a!”,请直接回车:
for /f "delims=" %%a in ('dir /b /a /a-d') do (
if "%%~fa" neq "%~0" (
set xz=%%~na
ren "%%~fa" "!xz:%a%=%b%!%%~xa" ))
cls&echo.&set /p c= 操作完成,输入 0 返回,输入其它任意字符退出
if "!c!"=="0" (goto 1) else (exit)
GOTO :EOF
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-26
@echo off
setlocal enabledelayedexpansion
for /r %%i in (*.txt) do (
set cc=%%~xi
echo %%~ni | findstr "B"&&(
set a=%%~ni
set "a=!a:B=C!"
ren "%%i" "!a!.txt"
)
)

存为Bat运行,即可把文件名中的B变成C,内容和格式不变。如果需要对所有格式文件操作,把for里面的*.txt换成*.*即可追问

可行,但我遇到了一个问题,我是通过存储过程调用这个BAT文件的,如果不加setlocal 这句是可行的(例如:bat文件内容如下@echo off MOVE C:\new\%~nx1.txt C:\new\%~nx2.txt),现在这个却不行,能不能不用延迟变量(不加setlocal enabledelayedexpansion,换一种方法)呢?

追答

MOVE C:\new\%~nx1.txt C:\new\%~nx2.txt

这句话写都写错了
不用变量延迟你可以换成下面这种
1. echo !m!变量延迟写法
2. call echo %%m%%
2种都是可行的,不过推荐上面那种,上面那个不行,下面应该也是不行的,你如果有其他需要,把要求写明,你给的代码明显就有误

追问

我那个确实可以执行,只是简单的将文件重命名;你就把你上面写那个换成CALL的方法吧,我试试,多谢

追答

@echo off
for /r %%i in (*.txt) do (
set cc=%%~xi
echo %%~ni | findstr "B"&&(
set a=%%~ni
set "a=!a:B=C!"
call ren "%%i" "%%a%%.txt"
)
)
你不是说把文件名中的B换成C么?该代码会查找目录中文件名所有含有B的文件,并把B换成C保存

追问

替换不了

追答

@echo off
for /r %%i in (*.txt) do (
set cc=%%~xi
echo %%~ni | findstr "B"&&(
set a=%%~ni
call set "a=%%a:B=C%%"
call ren "%%i" "%%a%%.txt"
)
)
少换了一个,现在OK了

追问

你试过吗?还是不行

追答

我测试过,可以啊,我找的是大写的B,你可能弄成小写去了,要想不区分大小写,把findstr 加/i就行了,没有提示,你看文件名就知道了

追问

报findstr不是内部或外部命令

追答

你的电脑神了

追问

晕!我的电脑不识别这个命令

追答

那你换成find也可以

追问

看来我的电脑有问题,find也识别不了

追答

。。。。。带你电脑去精神病院看看吧。救好了再来问

追问

今天改环境变量了

追答

一般不建议修改path,要就增加,莫要删除修改

追问

是啊

第2个回答  2013-09-26
@echo off&setlocal enabledelayedexpansion
for /r %%a in (*.txt) do (
set fn=%%~nxa
set fn=!fn:B=C!
rename "%%a" "!fn!"
)

 

批处理文件在最上一层文件夹内

追问

可不可以在CMD执行这个BAT,通过传入参数 ,例如:1.bat b c

追答

可以,%0代表批处理自己, %1代表第一个参数 ,以此类推
你可以再批处理开始阶段 赋值%1 ,%2......给变量 然后再set fn=!fn:B=C! 这一行把C代替掉。。
不理解追问吧,实在不行我给你重写一个。

追问

传入参数我弄出来了,但是有一个问题,把文件后缀也替换了,你帮我再加一个指定文件类型,并且只替换文件名,而且是精确匹配(比如把B替换成C,但是BB是不能替换成CC的),谢谢!

追答

我明白你的意思,一旦后缀包含B那么后缀的B也变成了C,文件失效。这个好办,后缀赋值就可以解决了。。。

这个精确匹配......依你的意思,是精确匹配B,一旦BB、BBB将不更改名称,我一时脑筋没转过来,不过想想应该可以解决,但会很麻烦,如果你的TXT文件比较有规律还好说,我先去吃饭,饭后我琢磨琢磨,其他网友有更好的答案那就更好了。

追问

是的,是那个意思,你先帮我解决不替换文件后缀吧,例如1.BAT T C txt (将目录下的所有TXT文件名中的T替换成C,文件名为AR_TT.TXT文件名不能替换,后缀也不能被替换了,文件名AC_T.TXT只能替换成AC_C.TXT,不能替换成AC_C.CXC了)。谢谢!

追答@echo off
setlocal enabledelayedexpansion
set var1=%1
set var2=%2
set var3=%3
for /r %%a in (*.!var3!) do (
set fn=%%~na
set fn=!fn:T=C!
rename "%%a" "!fn!.!var3!"
)
pause

 

精确匹配晚上回来给你弄,这个先解决后缀赋值问题。哈哈,和媳妇去逛商场去~~

追问

好的!真幸福!玩得开心点
(对了,更改后有空格a_m .txt,帮忙解决一下)

追答

空格这个问题,你把所有set 都加上引号,比如  set a=1  写成  set "a=1"

@echo off
setlocal enabledelayedexpansion
set "var1=%1"
set "var2=%2"
set "var3=%3"
for /r %%a in (*.!var3!) do (
    set "fnpath=%%a"
    set "fn=%%~na"
    echo !fn!|findstr "!var1!!var1!">nul||call :make
    )
)
exit
:make
if exist "!fnpath!" (
set "fn=!fn:%var1%=%var2%!"
rename "!fnpath!" "!fn!.!var3!"
)
goto :eof

追问

非常感谢,大部分功能都实现了,当前目录下也能精确匹配了,但是子目录下不能,麻烦你再看看,万分感谢!能不能不用延迟变量呢?数据库调用了替换不成功

追答

我自己测试子目录下也可以完成精确匹配..使用CMD操作先切换当前目录的话没问题,你最好说明一下你如何使用的。

不用延时变量我没试过,不过想想也非常的麻烦,不用延时变量的情况的,for语句找到的*.txt 赋不到fnpath变量。。

数据库这块你指的什么?原A_T.txt 改名A_C.txt 后再让数据库调用不成功?原A_T.txt调用成功么?

追问

数据库是ORACLE,通过oracle JOB传入二个参数调用这个BAT文件,开始我做的简单的改名文件名没有用延迟变量是可以的,但是现在这个加了延迟变量的好像就不行了,没有报错但是替换不成功

追答

楼主很高端,oracle job都玩得转,我理解你现在用oracle job建立好的存储过程导出所有txt,这个过程最后调用一次bat,把所有txt改名。。。。。。。。。

oracle job调用bat时的路径是什么? 没有路径找不到文件。

追问

我就是搞数据库的,调用Bat文件的时候写的是完全路径,job也没有报错,但就是不成功,我自己写那个简单的Bat就能,差别好像只有延迟变量

追答

你试一下在@echo off 下面加一句 pushd "文本路径",如果还不行我就不知道了,我个人认为就是找不到路径,oracle job 默认路径怎么可能是你本文所在路径呢?

楼主认为失败是变量延时导致,记得前面你用move命令试过成功了,那你试一下,move命令前启用变量延时,并且最好move后跟几个变量试试,如果成功和变量延时没关系。

如果不启用变量延迟,我也不知道该怎么做,只能帮到这了~~~~

追问

job是可以指定绝对路径的,如果找不到job会报错

追答

你说的我懂,我意思是你加一句pushd试试,
你job所在路径去执行bat文件,bat文件默认执行路径也是job的路径,而不是本文文件所在路径。

你试一下行不行

追问

在cmd下执行,报目录名称无效

追答

pushd 后面你的路径是什么? 复制过来,我看看

追问

就是Bat文件的绝对路径,电脑不能上网用的手机

追答

那真不知道了,毕竟我这没有oracle环境, pushd 后面路径要打上引号的。。再不行我也没办法了

追问

加引号了

本回答被提问者采纳
第3个回答  2013-09-26
在指定文件夹中做一个批处理文件,内容如下:

echo .>1.txt
dir *_B.txt /b >>1.txt
for /f %%a in (1.txt) do ren %%a\*_c.txt *_b.txt
del 1.txt追问

你试了吗?出来不结果

追答

我试过的。

echo  .>1.txt

dir /ad /b >>1.txt

for /f %%a in (1.txt) do ren %%a\*_d.txt *_C.txt

del 1.txt

相似回答