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] |
注意:以下的讲解,都是基于简体中文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的的变量就介绍到这了!
相关文章推荐
- Python cmd中输入'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
- 02-CMD_常用批处理内部命令2
- 转:批处理for命令详解
- WIN7的CMD界面下输入ipconfig后提示不是内部或外外部命令,也不是可运行的程序或批处理文件
- 解决jdk环境变量设置完后,在cmd中运行javac出现’javac‘不是内部或外部命令,也不是可运行的程序或批处理文件的错误提示
- 批处理for命令详解
- 批处理练习3---For命令
- c#中调用cmd命令执行批处理文件
- [WIN][BAT]常用批处理命令----for,if,call,errorlevel,start
- 配置maven环境变量cmd控制台提示:mvn不是内部或外部命令,也不是可运行的程序或批处理文件
- 使用批处理文件同时打多个CMD窗口且执行多条命令
- cmd 中连接mysql时报'mysql'不是内部或外部命令,也不是可运行的程序或批处理文件,该怎么办?
- win10的cmd中显示:telnet不是内部或外部命令也不是可运行的程序或批处理?
- 解决jdk环境变量设置完后,在cmd中运行javac出现’javac‘不是内部或外部命令,也不是可运行的程序或批处理文件的错误提示
- DOS 批处理命令For循环命令详解
- 批处理for命令详解(转) 批处理for命令详解
- 批处理练习3---for命令续
- 常用批处理命令总结4之For命令详解
- CMD文件中用FOR命令读取文本文件内容到变量,以及和PsExec搭配使用的方法和例子
- 批处理学习笔记9 - 深入学习For命令2