找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 37147|回复: 9

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

[复制链接]
发表于 2011-4-15 01:19:49 | 显示全部楼层 |阅读模式
本帖最后由 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是完整路径。在下新手,不知道这个如何解决,还望高手指点。
发表于 2011-4-15 01:32:07 | 显示全部楼层
本帖最后由 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
 楼主| 发表于 2011-4-15 11:23:04 | 显示全部楼层
本帖最后由 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

复制代码
 楼主| 发表于 2011-4-15 11:24:23 | 显示全部楼层
本帖最后由 hrhktkbzyy 于 2011-4-15 11:26 编辑

2# hanyeguxing

另外还想探讨一个问题,就是如果我想删除一些前后缀如何实现呢。我的思路是读出每一个文件名,%%~ni,然后赋值给字符串变量,再操作字符串,但是第一步我没有成功,测试如下:
  1. for /F "delims=" %%i in ('dir /b') do (set a="%%~nxi"&&echo %a%)
复制代码
显示echo处于关闭状态
发表于 2011-4-15 11:29:37 | 显示全部楼层
本帖最后由 hanyeguxing 于 2011-4-15 11:32 编辑
  1. for /F "delims=" %%i in ('dir /b') do (set a="%%~nxi"&echo;!a!)
复制代码
 楼主| 发表于 2011-4-15 11:40:57 | 显示全部楼层
5# hanyeguxing
不知版主测试如何,我测试的不行,输出!a!而不是a的内容
  1. @echo off
  2. for /F "delims=" %%i in ('dir /b') do (set a="%%~nxi"&echo;!a!)
  3. pause
复制代码

发表于 2011-4-15 11:47:28 | 显示全部楼层
本帖最后由 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
 楼主| 发表于 2011-4-15 11:56:09 | 显示全部楼层
7# hanyeguxing 谢谢版主的回复,这个论坛很好,我还要多多学习。
发表于 2016-4-5 10:23:58 | 显示全部楼层

  1. @echo -----------------------------
  2. @ set /p GTOPERATOR="继续操作吗?(yes/no) "

  3. if /i "%GTOPERATOR:~0,1%"=="y" (
  4.         goto GTCONTINUE
  5. ) else ( goto GTEXIT )
复制代码
发表于 2016-4-5 20:58:06 | 显示全部楼层
回复 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 05:38 , Processed in 0.031823 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表