Board logo

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

作者: tamicer    时间: 2013-7-29 13:04     标题: 请教批处理如何删除文件名中指定字符从而重命名文本文件

如何把: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
作者: tamicer    时间: 2013-7-29 13:05

实际应用中(001).txt前面的字节长度可能不等,多谢指教!
作者: tamicer    时间: 2013-7-29 13:19

琢磨了一上午不成功,哪位大师指点一下?
@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%
这个哪儿有问题
作者: apang    时间: 2013-7-29 15:36

没有必要用 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

你这里第二行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

4楼的,我严重怀疑,你将goto :eof放在pause后,而next后没有goto :eof能跳转成功吗?
作者: apang    时间: 2013-7-29 16:17

6楼的,那个啥,next后本来就是文件尾,加goto :eof不显得多余的吗?
作者: CrLf    时间: 2013-7-29 17:16

本帖最后由 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

回复 8# CrLf

...首先,我严重声明,由于老版本call的解释+一群人的误导+自己家XP有问题,导致了自己的思维定视,谢谢纠正。
顺便问下,我家CMD的命令"echo."解析错误,这咋办?它显示" "echo."不是那啥,更不是那啥的"
作者: CrLf    时间: 2013-7-29 18:43

回复 9# 飏有泪


    看来你的系统是有点不正常,试试别的写法,参考:
http://bbs.bathome.net/viewthread.php?tid=18350
http://bbs.bathome.net/viewthread.php?tid=18352
作者: apang    时间: 2013-7-29 19:57

回复  飏有泪


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



    CrLf的耐心真令人钦佩,我差点骂那啥泪不泪的咧
我得学习忍耐,嗯嗯。
作者: CrLf    时间: 2013-7-29 20:08

回复 11# apang


    刚被某区的那位剁什么煮刺激过,我已经各种免疫了...
    回完帖子发现被屏蔽,填写的理由够简短:“mlgb”
    玩脚本而已,自己无愧就好,共勉
作者: 飏有泪    时间: 2013-8-1 15:25

谢CrLf老兄解惑了




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