Board logo

标题: [文本处理] 删除行中的重命名的BAT批处理为何出错? [打印本页]

作者: lzyecho    时间: 2014-1-13 19:09     标题: 删除行中的重命名的BAT批处理为何出错?

下面代码是关于对本目录及下级子目录中“批量删除含有指定字符串的行”的批处理代码,但是执行到最后重命名没在成功!即 代码 ren "%%ix" "%%i" 没起作用。请帮忙查找原因?(我手动改名后对比了文件里的内容都能达到目的。)
另外我将for语句换成 for /f "tokens=1 delims=" %%i in ('dir /s/a/b *.txt') do,也是出现同样问题!
但是若换成('dir /a/b *.txt'),即去掉dir的参数/s则能正确执行,但是却不能对下级子目录中的文件操作。 各位老大,谢谢帮忙。
  1. @echo off
  2. rem 批量删除含有指定字符串的行
  3. set /p "str=请输入要删除行包含的字符串并回车:"
  4. echo.
  5. echo 开始操作,请稍后...
  6. for /r %%i in (*.txt) do (
  7. (findstr /v/r "%str%" "%%i">"%%ix") & (del /a /f /q "%%i") &( ren "%%ix" "%%i")
  8.    )2>nul
  9. echo.
  10. echo 操作完成,按任意键结。。。。。。
  11. pause>nul
复制代码

作者: apang    时间: 2014-1-13 20:12

本帖最后由 apang 于 2014-1-13 20:25 编辑

ren 的格式是: ren "路径+文件(夹)名" "新文件(夹)名"
"新文件(夹)名" 不能包含路径。如果包含路径,就有可能重命名到其它地方,相当于移动,这是不允许的。
作者: DAIC    时间: 2014-1-13 21:10

  1. @echo off
  2. rem 批量删除含有指定字符串的行
  3. set /p "str=请输入要删除行包含的字符串并回车:"
  4. echo.
  5. echo 开始操作,请稍后...
  6. for /r %%i in (*.txt) do (
  7.     findstr /v /r "%str%" "%%i" >"%%ix" && move /y "%%ix" "%%i"
  8. )
  9. echo.
  10. echo 操作完成,按任意键结。。。。。。
  11. pause>nul
复制代码

作者: lzyecho    时间: 2014-1-13 23:04

本帖最后由 lzyecho 于 2014-1-13 23:43 编辑

回复 3# DAIC


    感谢二位的热心解答!!感谢apang的对ren命令的详细说明;特别是DAIC,你给出的move命令很好的解决了同时处理子目录的问题!
但有一个余留问题就是(我做了多次测试):当少数文件中只有一行时,最后一步的move命令失效!! , 能否解决?
作者: lzyecho    时间: 2014-1-13 23:41

回复 4# lzyecho


    借用DAIC提示的思路,我做了多次互换测试,发现将for语句做如下更改则可以达到目的,原因不知,请懂的朋友给解释一下,先谢了!
  1. @echo off
  2. rem 批量删除含有指定字符串的行
  3. set /p "str=请输入要删除行包含的字符串并回车:"
  4. echo.
  5. echo 开始操作,请稍后...
  6. for /f "tokens=1 delims=" %%i in ('dir /s/a/b *.txt') do (
  7. (findstr /v/r "%str%" "%%i">"%%ix") & (move /y "%%ix" "%%i"
  8. )
  9.    )1>nul 2>nul
  10. echo.
  11. echo 操作完成,按任意键结。。。。。。
  12. pause>nul
复制代码

作者: lzyecho    时间: 2014-1-14 00:16

回复 3# DAIC


    再次测试发现,将DAIC 的do 语句中连接两个命令的&&换成一个&却能顺利执行,达到目的!!也不知原因??
呵呵,太晚了,睡啦。。。
作者: DAIC    时间: 2014-1-14 08:17

回复 6# lzyecho


&&是findstr执行成功的情况下才执行move
&是不管findstr执行是否成功都要执行move
作者: lzyecho    时间: 2014-1-14 09:29

回复 7# DAIC


    这两个符号的意思我知道的,(从重命名后没有删除的文件改成txt文件格式后能看出来,确实达到了目的),但是却执行不了我上面说的问题,请求解释。
作者: DAIC    时间: 2014-1-14 14:40

回复 8# lzyecho


达到了什么目的?
执行不了你说的什么问题?
作者: lzyecho    时间: 2014-1-14 16:31

本帖最后由 lzyecho 于 2014-1-14 16:36 编辑

回复 9# DAIC

感谢DAIC的热心解答!!!
第一个,解决了删除了指定的行!第二,但是没有将文件名改回来!也就我在4楼提出的问题:若多个文件中只有一行时,move命令失效!而其它多行则不存在这个问题。
作者: DAIC    时间: 2014-1-14 16:49

回复 10# lzyecho


你不是说把 && 改成 & 之后就成功了吗?
对于只有一行内容的文件,你在文件末尾加个空行试试。




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