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

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

[复制链接]
发表于 2022-1-23 02:24:05 | 显示全部楼层 |阅读模式
昨天发了一个贴子,网友帮着解决了,非常感谢。夜里没事又调试了一下(主要想再看下原来的思路究竟哪儿出错误了),发现还是有个地方解释不了
先说场景:我有一些文件想发给客户,发完之后想在文件名前面加个标记,比如原文件是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

所以就想问下,只是改了一个顺序为什么差别这么大?我觉得里面肯定有啥细节没有了解到,有懂的老哥指导下,谢谢
发表于 2022-1-23 09:28:34 | 显示全部楼层
回复 1# 小龙虾
实际上这是批处理预处理机制造成的。
不带参数的for和for /f +dir在处理文件时机理不同,不是一两句话能够说清楚的,实际上我也不懂。
你出现的情况解决办法:
1.使用for /f + dir
2.使用不带参数的for重命名文件加前缀时最前面可以加个排序在前的字符(@、#、-等)即可。比如#mark或-mark。
发表于 2022-1-23 13:32:30 | 显示全部楼层
回复 1# 小龙虾


    建议暂时忘掉你这种for命令的写法,一律改用 for /f + dir
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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