Board logo

标题: [文件操作] 批处理怎样在文件名两边/首尾添加指定前缀后缀/字符串? [打印本页]

作者: hrhktkbzyy    时间: 2011-4-15 01:19     标题: 批处理怎样在文件名两边/首尾添加指定前缀后缀/字符串?

本帖最后由 pcl_test 于 2016-9-3 19:37 编辑

想要实现为一批文件批量添加前缀,所以研究了一下批处理,先上代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo "请输入所要添加的标题前缀[不添请回车]"
  4. set /p str1=
  5. echo "请输入所要添加的标题后缀[不添请回车]"
  6. set /p str2=
  7. :chose
  8. echo "是否应用到子文件夹中(Y/N)"
  9. set /p cho=
  10. if "%cho%"=="Y" goto 1
  11. if "%cho%"=="y" goto 1
  12. if "%cho%"=="N" goto 2
  13. if "%cho%"=="n" (goto 2) else (goto chose)
  14. :1
  15. for /f "delims=" %%i in ('dir /a-d/b/s') do (if not "%%i"==%0 ren "%%i" "%str1%%%~ni%str2%%%~xi")
  16. goto 3
  17. :2
  18. for /f "delims=" %%i in ('dir /a-d /b *.*') do (if not "%%i"==%0 ren "%%i" "%str1%%%~ni%str2%%%~xi")
  19. goto 3
  20. :3
  21. pause
复制代码
运行基本正确,但是:2部分还是修改批处理文件本身的文件名,也就是
  1. if not "%%i"==%0
复制代码
这个判断失效,我将%%i和%0打印出来发现%0是完整路径。在下新手,不知道这个如何解决,还望高手指点。
作者: hanyeguxing    时间: 2011-4-15 01:32

本帖最后由 hanyeguxing 于 2011-4-15 01:38 编辑

以2部分为例:
  1. :2
  2. for /f "delims=" %%i in ('dir /a-d /b *.*') do (if not "%%i"==%0 ren "%%i" "%str1%%%~ni%str2%%%~xi")
  3. goto 3
复制代码
1,在if中推荐引号在==前后对应使用,最好写成:if not "%%~i"=="%~0"
2,dir /a-d /b *.*出来的不带绝对路径,%0带路径,如果你弄不明白为了统一可以同时扩展他们都带路径
3,if比较字符串时推荐使用/i
if 写成这样就比较保险 if /i not "%%~fi"=="%~f0"

ps:顺便说一下,如果使用call,慎重使用%0
作者: hrhktkbzyy    时间: 2011-4-15 11:23

本帖最后由 hrhktkbzyy 于 2011-4-15 11:31 编辑

2# hanyeguxing
谢谢版主,查了一下帮助,明白版主的意思了。问题解决,现在贴上代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo "请输入所要添加的标题前缀[不添请回车]"
  4. set /p str1=
  5. echo "请输入所要添加的标题后缀[不添请回车]"
  6. set /p str2=
  7. :chose
  8. echo "是否应用到子文件夹中(Y/N)"
  9. set /p cho=
  10. if "%cho%"=="Y" goto 1
  11. if "%cho%"=="y" goto 1
  12. if "%cho%"=="N" goto 2
  13. if "%cho%"=="n" (goto 2) else (goto chose)
  14. :1
  15. for /f "delims=" %%i in ('dir /a-d/b/s') do (if /i not "%%~fi"=="%~f0" ren "%%i" "%str1%%%~ni%str2%%%~xi")
  16. goto 3
  17. :2
  18. for /f "delims=" %%i in ('dir /a-d /b *.*') do (if /i not "%%~fi"=="%~f0" ren "%%i" "%str1%%%~ni%str2%%%~xi")
  19. goto 3
  20. :3
  21. pause
复制代码

作者: hrhktkbzyy    时间: 2011-4-15 11:24

本帖最后由 hrhktkbzyy 于 2011-4-15 11:26 编辑

2# hanyeguxing

另外还想探讨一个问题,就是如果我想删除一些前后缀如何实现呢。我的思路是读出每一个文件名,%%~ni,然后赋值给字符串变量,再操作字符串,但是第一步我没有成功,测试如下:
  1. for /F "delims=" %%i in ('dir /b') do (set a="%%~nxi"&&echo %a%)
复制代码
显示echo处于关闭状态
作者: hanyeguxing    时间: 2011-4-15 11:29

本帖最后由 hanyeguxing 于 2011-4-15 11:32 编辑
  1. for /F "delims=" %%i in ('dir /b') do (set a="%%~nxi"&echo;!a!)
复制代码

作者: hrhktkbzyy    时间: 2011-4-15 11:40

5# hanyeguxing
不知版主测试如何,我测试的不行,输出!a!而不是a的内容
  1. @echo off
  2. for /F "delims=" %%i in ('dir /b') do (set a="%%~nxi"&echo;!a!)
  3. pause
复制代码


作者: hanyeguxing    时间: 2011-4-15 11:47

本帖最后由 hanyeguxing 于 2011-4-15 11:52 编辑

6# hrhktkbzyy


你原来的代码中第二行不是有 setlocal enabledelayedexpansion 吗?没有就加上
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /F "delims=" %%i in ('dir /b') do (set a="%%~nxi"&echo;!a!)
  4. pause
复制代码
setlocal enabledelayedexpansion
作用1,使用延迟的变量
作用2,开始变量本地化
关于变量延迟的问题,本论坛搜索“变量 延迟”,例如http://bbs.bathome.net/thread-3083-1-1.html
作者: hrhktkbzyy    时间: 2011-4-15 11:56

7# hanyeguxing 谢谢版主的回复,这个论坛很好,我还要多多学习。
作者: 网上邻居    时间: 2016-4-5 10:23

  1. @echo -----------------------------
  2. @ set /p GTOPERATOR="继续操作吗?(yes/no) "
  3. if /i "%GTOPERATOR:~0,1%"=="y" (
  4. goto GTCONTINUE
  5. ) else ( goto GTEXIT )
复制代码

作者: pcl_test    时间: 2016-4-5 20:58

回复 9# 网上邻居
  1. @echo off
  2. set /p c=继续操作吗(Y/N)?
  3. 2>nul call :%c%
  4. pause&exit
  5. :Y
  6. echo;%c%&goto :eof
复制代码
  1. @echo off
  2. set /a #Y=c=1
  3. set /p c=继续操作吗(Y/N)?
  4. >nul 2>&1 set #%c%&&echo;%c%
  5. pause
复制代码





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