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

[文件操作] 请教批处理如何删除文件名中指定字符从而重命名文本文件

[复制链接]
发表于 2013-7-29 13:04:26 | 显示全部楼层 |阅读模式
如何把:a(001).txt、b(001).txt、c(001).txt、d(001).txt、e(001).txt、f(001).txt、g(001).txt
重命名为:
a.txt、b.txt、c.txt、d.txt、e.txt、f.txt、g.txt
 楼主| 发表于 2013-7-29 13:05:46 | 显示全部楼层
实际应用中(001).txt前面的字节长度可能不等,多谢指教!
 楼主| 发表于 2013-7-29 13:19:24 | 显示全部楼层
琢磨了一上午不成功,哪位大师指点一下?
@echo off
for /f "delims=" %%a in ('dir/b *.txt') do call :next %%a
pause
goto :eof
:next
set pp=%a
:loop
if %pp:~-9%=="001).txt" set pp=%pp:~-9%=="001).txt"& goto :loop
ren %a %pp%
这个哪儿有问题
发表于 2013-7-29 15:36:52 | 显示全部楼层
没有必要用 call,一定要用call的话,参数应该是%1而不是%a,像这样:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d/b "*(001).txt"') do (
  3.     call :Next "%%a"
  4. )
  5. pause&goto :eof

  6. :Next
  7. set "pp=%~1"
  8. set "pp1=%pp:~,-9%.txt"
  9. ren "%pp%" "%pp1%"
复制代码
不用call,就像这样:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d/b "*(001).txt"') do (
  3.     set "Name=%%a"
  4.     setlocal enabledelayedexpansion
  5.     ren "!Name!" "!Name:~,-9!.txt"
  6.     endlocal
  7. )
  8. pause
复制代码
发表于 2013-7-29 15:45:51 | 显示全部楼层
你这里第二行call :next %%a,你指定了:next的第一参数%1,而你又在next标签段中没用到第一参数,也不知你是咋想的?!
还有,用了call :next,就要在next段末尾加上goto :eof,就算改好了,那程序跳转又出问题了,你for完后,pause后,又跑到next上去了,有goto :eof就跳回文件开头,没有就继续执行loop!
我猜你想在call :next后执行loop,用for枚举循环,所以,你的loop标签就没意义了!只要在文件末加上goto :eof就可以了!
以上是跳转问题,程序构架问题,接下来谈谈语法问题!
在倒数第二行,你有个病句:set pp=%pp:~-9%=="001).txt"
在数学中,这是连等,在bat中,这是错误!
应该是set "pp=%pp:~-9%.txt"这个不知是你复制错误了还是其他。
最后,再给你个想法,你这里是要替换"(001)"可以考虑用set的替换,把它替换为空再改名!
由于在DNF虚弱时回答的,就简略了些,你的代码、我的代码也没做测试,就这样!
发表于 2013-7-29 16:01:07 | 显示全部楼层
4楼的,我严重怀疑,你将goto :eof放在pause后,而next后没有goto :eof能跳转成功吗?
发表于 2013-7-29 16:17:17 | 显示全部楼层
6楼的,那个啥,next后本来就是文件尾,加goto :eof不显得多余的吗?
发表于 2013-7-29 17:16:04 | 显示全部楼层
本帖最后由 CrLf 于 2013-7-29 17:31 编辑

回复 6# 飏有泪


    goto /? 里有解释:
GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前
批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的
办法。有关能使该功能有用的 CALL 命令的扩展描述,请键入
CALL /?。

    简单说就是 :EOF 是隐含于脚本末尾的标签,一般用于退出函数(严格来说是过程),可以理解为 END OF FILE,goto :EOF 类似 fseek(fp,0,SEEK_END);,我更喜欢用 exit/b 代替

    批处理的标签中不需要声明形参之类的,隐含在 %0、%1~%9、%* 中,被 call 的时候会自动解析

    %pp:~-9% 这个我数了下好像是没错,(001).txt 这段是 9 个字符长度的

    总之目测 2 楼代码目测是无误的,你可能没有测试
发表于 2013-7-29 17:37:58 | 显示全部楼层
回复 8# CrLf

...首先,我严重声明,由于老版本call的解释+一群人的误导+自己家XP有问题,导致了自己的思维定视,谢谢纠正。
顺便问下,我家CMD的命令"echo."解析错误,这咋办?它显示" "echo."不是那啥,更不是那啥的"
发表于 2013-7-29 18:43:54 | 显示全部楼层
回复 9# 飏有泪


    看来你的系统是有点不正常,试试别的写法,参考:
http://bbs.bathome.net/viewthread.php?tid=18350
http://bbs.bathome.net/viewthread.php?tid=18352
发表于 2013-7-29 19:57:59 | 显示全部楼层
回复  飏有泪


    看来你的系统是有点不正常,试试别的写法,参考:
CrLf 发表于 2013-7-29 18:43



    CrLf的耐心真令人钦佩,我差点骂那啥泪不泪的咧
我得学习忍耐,嗯嗯。
发表于 2013-7-29 20:08:18 | 显示全部楼层
回复 11# apang


    刚被某区的那位剁什么煮刺激过,我已经各种免疫了...
    回完帖子发现被屏蔽,填写的理由够简短:“mlgb”
    玩脚本而已,自己无愧就好,共勉
发表于 2013-8-1 15:25:17 | 显示全部楼层
谢CrLf老兄解惑了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 12:45 , Processed in 0.019891 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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