[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 菜鸟求助批处理for循环的问题,有个地方不能理解

昨天发了一个贴子,网友帮着解决了,非常感谢。夜里没事又调试了一下(主要想再看下原来的思路究竟哪儿出错误了),发现还是有个地方解释不了
先说场景:我有一些文件想发给客户,发完之后想在文件名前面加个标记,比如原文件是1111.txt,现在想改成"mark1111.txt"或者"已发1111.txt",也就是常规的文件重命名。

结果在调试的时候又发现一个文件重命名的代码,不过它的目标和我的不一样,它是把添加的内容放在中间,比如原文件名是:1111.txt,它想改成:11mark11.txt
思路是先提取前两个字符,接着和"mark"拼接,再接着和串的剩余部分拼接,思路也很清晰明了。代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set flag=mark
  4. for %%i in (*.txt) do (
  5. set "name=%%i"
  6. set a="!name:~0,2!"
  7. set b="!name:~2!"
  8. set a=!a!%flag%
  9. set d=!a!!b!
  10. ren "%%i" "!d!"
  11. )
  12. pause
复制代码
代码工作的没有问题。看到这代码,我就想把它前面的拼接顺序改下:
set a=!a!%flag% 改成:set a=%flag%!a!
这样不就实现目标了吗?结果翻车了....

发现for循环还是像以前一样,多执行了一次
希望改成:mark1111.txt mark2222.txt
结果:markmark1111.txt mark2222.txt

所以就想问下,只是改了一个顺序为什么差别这么大?我觉得里面肯定有啥细节没有了解到,有懂的老哥指导下,谢谢

回复 1# 小龙虾


    建议暂时忘掉你这种for命令的写法,一律改用 for /f + dir
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1# 小龙虾
实际上这是批处理预处理机制造成的。
不带参数的for和for /f +dir在处理文件时机理不同,不是一两句话能够说清楚的,实际上我也不懂。
你出现的情况解决办法:
1.使用for /f + dir
2.使用不带参数的for重命名文件加前缀时最前面可以加个排序在前的字符(@、#、-等)即可。比如#mark或-mark。

TOP

返回列表