您的位置:首页 > 其它

cmd 批处理 for 命令

2012-05-29 05:36 246 查看
首发地址:http://bbs.bathome.cn/thread-2189-1-1.html

一 前言

二 for语句的基本用法

三 for /f 含变量延迟

四 for /r

五 for /d

六 for /l

一、前言

   在批处理中,for是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/递减等操作成为可能;配合if、call、goto等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作;合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦。

而能否熟练使用for语句,已经成为衡量一个人批处理水平高低最主要的标准。

[align=center][/align]
  在这个系列教程中,我将通过实际应用中频繁出现的例子,带领大家步入for语句的神奇之门,一步步迈向for语句的魔幻殿堂,使得大家在实际的应用中,能独立写出简洁高效的代码,在批处理的世界里自由驰骋。
  注意:以下的讲解,都是基于简体中文Windows XP Pro SP3的操作系统环境

二、for语句的基本用法[2008.11.9更新]

  正如色彩缤纷的七彩光芒是由红绿蓝三原色构成的一样,最复杂的for语句,也有其基本形态,它的模样是这样的:

  在cmd窗口中:for %I in (command1) do command2

   在批处理文件中:for %%I in (command1) do command2

  之所以要区分cmd窗口和批处理文件两种环境,是因为在这两种环境下,命令语句表现出来的行为虽然基本一样,但是在细节上还是稍有不同,最明显的一个差异就是:在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%I;而在批处理文件中,引用形式变量I必须使用双百分号,即%%I。为了方便起见,若不是特别强调,以下的讲解都以批处理文件环境为例。

  我们先来看一下for语句的基本要素都有些什么:

  1、for、in和do是for语句的关键字,它们三个缺一不可;

   2、%%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;

   3、in之后,do之前的括号不能省略;

   4、command1表示字符串或变量,command2表示字符串、变量或命令语句;

  现在,你可能已经会写一个简单的for语句了,比如:

[code1]

@echo off

for %%I in (bbs.bathome.cn) do echo %%I

pause

  保存为批处理文件并执行,将会在弹出的批处理窗口中看到这样的信息:

[result1]

bbs.bathome.cn

请按任意键继续...

  很快地,你会觉得这个for语句是如此的简单,简单到你丝毫感受不出它的强大:这个for语句,和我直接用echo语句没什么两样啊!

  是的,演示代码永远都只是演示而已,就像大多数高级语言的教科书一样,在引导新手学习的时候,基本上都是千篇一律地告诉大家如何编写一个能显示 hello world! 的窗口,从这些演示代码中,你看不到它们具有多少实用性,你只是感到有点好奇:咦,居然弹出了一个窗口?片刻之后,你就会觉得索然无味。

  那好吧,为了让大家对for更加感兴趣,我们先来分析一下for语句的一些注意事项,之后,再让大家看看更为强大的for语句实例。

 

---------------------------------------------------------------------------------------------------------------------------

 

先把FOR的变量全部列出来:

      ~I            - 删除任何引号("),扩展 %I

      %~fI          - 将 %I 扩展到一个完全合格的路径名

      %~dI          - 仅将 %I 扩展到一个驱动器号

      %~pI          - 仅将 %I 扩展到一个路径

      %~nI          - 仅将 %I 扩展到一个文件名

      %~xI          - 仅将 %I 扩展到一个文件扩展名

      %~sI          - 扩展的路径只含有短名

      %~aI          - 将 %I 扩展到文件的文件属性

      %~tI          - 将 %I 扩展到文件的日期/时间

      %~zI          - 将 %I 扩展到文件的大小

      %~$PATH:I     - 查找列在路径环境变量的目录,并将 %I 扩展

                    到找到的第一个完全合格的名称。如果环境变量名

                    未被定义,或者没有找到文件,此组合键会扩展到

                    空字符串

我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量名是什么,这里就写什么.

比如:FOR /F    %%z IN ('set') DO @echo %%z

这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz

至于前面的%~p这样的内容就是语法了!

好开始讲解:

~I            - 删除任何引号("),扩展 %I

这个变量的作用就如他的说明,删除引号!

我们来看这个例子:

首先我们在桌面建立一个名字为temp.txt文本文件,在里面输入这些内容

"1111

2222"

"3333"

44"44

然后在建立个BAT文件代码如下:

FOR /F "delims=" %%i IN (temp.txt) DO @echo    %%~i

pause

执行后,我们看CMD的回显如下:

1111

2222"

3333

44"44

和之前temp.txt中的内容对比一下,我们会发现第一行和第三行的引号都消失了,这就是删除引号~i的作用了!

删除引号规则如下(BAT兄补充!)

1、若字符串首尾同时存在引号,则删除首尾的引号;

2、若字符串尾不存在引号,则删除字符串首的引号;

3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。

%~fI          - 将 %I 扩展到一个完全合格的路径名

看例子:

把代码保存放在随便哪个地方,我这里就放桌面吧.

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~fi

pause

执行后显示内容如下

C:\Documents and Settings\Administrator\桌面\test.bat

C:\Documents and Settings\Administrator\桌面\test.vbs

当我把代码中的 %%~fi直接改成%%i

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%i

pause

执行后就会显示这些内容

test.bat

test.vbs

通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用

也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单

单打印一个文件名,自己动手动实验下就知道了!

%~dI          - 仅将 %I 扩展到一个驱动
4000
器号

看例子:

代码如下,我还是放到桌面执行!

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~di

pause

执行后我CMD里显示如下

C:

C:

我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件

或者目录所在的盘符号打印出来!

%~pI          - 仅将 %I 扩展到一个路径

这个用法和上面一样,他只打印路径不打印文件名字

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~pi

pause

我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!

%~nI          - 仅将 %I 扩展到一个文件名

只打印文件名字

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~ni

pause

%~xI          - 仅将 %I 扩展到一个文件扩展名

只打印文件的扩展名

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~xi

pause

%~sI          - 扩展的路径只含有短名

打印绝对短文件名

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~si

pause

%~aI          - 将 %I 扩展到文件的文件属性

打印文件的属性

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~ai

pause

%~tI          - 将 %I 扩展到文件的日期/时间

打印文件建立的日期

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~ti

pause

%~zI          - 将 %I 扩展到文件的大小

打印文件的大小

FOR /F "delims==" %%i IN ('dir /b') DO @echo    %%~zi

pause

%~$PATH:I     - 查找列在路径环境变量的目录,并将 %I 扩展

                    到找到的第一个完全合格的名称。如果环境变量名

                    未被定义,或者没有找到文件,此组合键会扩展到

                    空字符串

这是最后一个,和上面那些都不一样,我单独说说!

我们先在桌面建立一个temp.txt文件,里面写上这些内容

c:\windows

c:\windows\system32

c:\windows\teett

然后在把这些代码保存为批处理,放在桌面.

FOR /F "delims==" %%i IN (temp.txt) DO @echo    %%~$PATH:i

pause

执行后CMD显示如下内容

c:\WINDOWS

c:\WINDOWS\system32

ECHO 处于打开状态。

为什么会这样呢,还有一行c:\windows\teett呢?

我们直接在CMD里输入echo %path% 会显示C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem

%%~$PATH:i也就是在文本里寻找匹配这个PATH变量值的内容,如果里面的内容和PATH变量相同,就打印出来

如果不相同,就显示一个空行!

只能适用于PATH变量,其他变量不行,如果要比较很多值,可尝试把值赋予给PATH变量,我没测试!

好了,FOR的的变量就介绍到这了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐