bat批量替换特定字符文件名称
答案:4 悬赏:60 手机版
解决时间 2021-03-14 06:14
- 提问者网友:相思似海深
- 2021-03-13 18:42
bat批量替换特定字符文件名称
最佳答案
- 五星知识达人网友:十鸦
- 2021-03-13 20:20
@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
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楼网友:动情书生
- 2021-03-13 23:55
@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 后面路径要打上引号的。。再不行我也没办法了追问加引号了
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 后面路径要打上引号的。。再不行我也没办法了追问加引号了
- 2楼网友:骨子里都是戏
- 2021-03-13 22:50
在指定文件夹中做一个批处理文件,内容如下:
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
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
- 3楼网友:渡鹤影
- 2021-03-13 21:13
@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,要就增加,莫要删除修改追问是啊
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,要就增加,莫要删除修改追问是啊
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯