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

CMD窗口和批处理中for命令的写法有什么不同的地方?

比如我想把D盘下所有文件后缀名都改成TXT.在CMD窗口下和本文下分别该怎么写呢?

批处理:
  1. @echo off
  2. for /r "d:" %%a in (*) do if /i not "%%a"=="%~0" ren "%%a" "%%~na.txt"
复制代码
cmd:
  1. for /r "d:" %a in (*) do @ren "%a" "%~na.txt"
复制代码

顺便说一下,楼主把这些和http://bbs.bathome.net/thread-10399-1-1.html中的比较一下,就知道哪错了。。。

[ 本帖最后由 hanyeguxing 于 2010-12-21 13:58 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

我想这个再配合点实例效果会更好,只要LZ肯实践
for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行(特指do后的命令行)分析处理的功能。而command/cmd实现for时自然会借用自身原有的命令行分析模块,因此for具有二级转义的特性,for中do后的语句被分两级分析和解释,第一级在command/cmd读入并解释for命令行时,第二级在for读入并解释do命令时,它通常会对同一命令行的进行多次解释。

      然后,我们可以注意到,在do中使用命令行参数变量和环境变量时,不需要双%,那是因为,这些变量在经过第一级转义后,被替换成特定的不变的字符串常量,参与for循环的所有执行过程;而替代变量则要求在执行(do后的子命令行中)过程中不断的动态变化,而这个变化自然仍需要通过脱逸字符来实现,因此使用双%就是成了必然的选择。

      另外,还需要注意到,在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同。在早期的DOS版本中,%在命令行中不被视为转义字符,所以不会被转义和脱逸,所以当时无法在命令行直接引用环境变量。而使用for时,只需要一个%供for进行转义和脱逸就够了。在以后的命令解释器版本中,加入了命令行转义的支持(主要是环境变量的支持),但命令行for使用单%的传统仍然保留了下来。

      而 cmd中的变量延迟替换是属于特殊的情况,但不违背以上的转义原则,只是for中的环境变量不再是常量了

TOP

CMD下少用一个%。如%i
批处理下多一个%。如%%i
---学无止境---

TOP

返回列表