`

WindowsBatch与LinuxShell比较[batchfile之for命令详解]

 
阅读更多

WindowsBatch与LinuxShell比较[batchfile之for命令详解]

一 介绍

FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)。 可以在CMD输入for /?看系统提供的帮助!

FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令

参数: FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释
%%变量名: 这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他;
IN:命令的格式,照写就是了;
(相关文件或命令): FOR要把什么东西读取然后赋值给变量,看下面的例子;
do:命令的格式,照写就是了!
执行的命令:对每个变量的值要执行什么操作就写在这.

二 /d 仅处理目录
如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。
系统帮助的格式:FOR /D %%variable IN (set) DO command

他主要用于目录搜索,不会搜索文件,看这样的例子
@echo off
for /d %%i in (*) do @echo %%i
pause
把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!


在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来
@echo off
for /d %%i in (???) do @echo %%i
pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了


思考题目:
@echo off
for /d %%i in (window?) do @echo %%i
pause
保存到C盘下执行,会显示什么呢?自己看吧!
/D参数只能显示当前目录下的目录名字,这个大家要注意!

三 /R 递归

进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是当前目录。如果 Set 只是一个句点 (.),则只枚举目录树。
系统帮助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command

上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比/D强大多了!

他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!
@echo off
for /r c:\ %%i in (*.exe) do @echo %%i
pause
咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了,这里的c:\就是目录了。

再来一个
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
参数不一样了,这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他防灾d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出来!!!

四 /L 迭代数值范围
使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。
如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是:
系统帮助的格式:for /L %% Variable in (Start#,Step#,End#) do Command

例如:
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
保存执行看效果,他会打印从1 2 3 4 5 这样5个数字(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!

再看这个例子
@echo off
for /l %%i in (1,1,5) do start cmd
pause
执 行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535看完这个被我赋予破坏性质的参数后,我们来看最后一个参数

五 /f
含有/F的for详细说明
含有/F的for有很大的用处,在批处理中使用的最多,用法如下:
格式:
FOR /F ["options"] %%i IN (file) DO command
FOR /F ["options"] %%i IN ("string") DO command
FOR /F ["options"] %%i IN ('command') DO command
这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

file代表一个或多个文件
string 代表字符串
command代表命令
["options"] 可选

对于FOR /F %%i IN (file) DO command
file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。

假如文件a.txt中有如下内容:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
你想显示a.txt中的内容,会用什么命令呢?当然是type,type a.txt

for也可以完成同样的命令:
for /f %%i in (a.txt) do echo %%i
还是先从括号执行,因为含有参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,

{"第1行第1列 第1行第2列 第1行第3列", //第一个元素
"第2行第1列 第2行第2列 第2行第3列", //第二个元素
"第3行第1列 第3行第2列 第3行第3列"} //第三个元素
集合中只有3个元素,同样用%%i依次代替每个元素,然后执行do后面的命令。

具体过程:
用%%i代替"第1行第1列 第1行第2列 第1行第3列",执行do后面的echo %%i,显示"第1行第1列 第1行第2列 第1行第3列",
用%%i代替"第2行第1列 第2行第2列 第2行第3列",执行echo %%i,显示"第2行第1列 第2行第2列 第2行第3列",
依次,直到每个元素都代替完为止。

为了加强理解/f的作用,请执行一下两个命令,对比即可明白:
for /f %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中的内容。

for %%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字,并不会读取其中的内容。

通过上面的学习,我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。

它们就是:delims和tokens

delims 用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键
比如,还是上面的文件,我们执行下面的命令:
for /f "delims= " %%i in (a.txt) do echo %%i
显示的结果是:

第1行第1列
第2行第1列
第3行第1列

为什么是这样的呢。因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。
执行过程是:

将第一个元素"第1行第1列 第1行第2列 第1行第3列"分成三个元素:"第1行第1列" "第1行第2列" "第1行第3列",它默认只取第一个,即"第1行第1列",然后执行do后面的命令,依次类推。
但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢?
这时候,tokens跳出来说,我能做到。
它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。
还是上面的例子,执行如下命令:
for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
执行结果:

第1行第2列
第2行第2列
第3行第2列

如果要显示第三列,那就换成tokens=3。
同时tokens支持通配符*,以及限定范围。
如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。
此时的命令为:
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
怎么多出一个%%j?
这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。
并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j
执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。
比如:
for /f "tokens=* delims= " %%i in (a.txt) do echo %%i
执行结果为:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。
再如:
for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j
执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

用%%i代替第二列,用%%j代替剩余的所有
最后还有skip合eol,这俩个简单,skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。
比如:
for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i
结果为:

第3行第1列 第3行第2列 第3行第3列

用skip来告诉for跳过前两行。
如果不加tokens=*的话,执行结果为:
第3行第1列
不知道怎么回事。
再如,当a.txt内容变成:

.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

执行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i结果是:
第3行第1列 第3行第2列 第3行第3列
用eol来告诉for忽略以"."开头的行。

同样也必须加tokens=*,否则只会显示"第3行第1列"。

@echo off
for /f "skip=5 tokens=*" %%i in (hero.txt) do ( echo %%i )
pause
结果:忽略了前5行。
解说:关键字skip=后面的数字代表要忽略的行数。

我们在此总结一下for命令/f参数下双引号""中的参数。
skip=跳过的行数
eol=忽略以该符号开头的行
tokens=每一行的第几个部分
delims=分隔符
usebackq 见上,用来改变“”的含义。


六 注意
复制代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@echooff

for/f %%i in ('set')do(

echo %%i

)

pause

结果:列出所有的环境变量。 解说:后单引号''中的字符串是命令。 注意:(set)代表的是文件set,("set")代表的是字符串set,('set')代表的是命令set。请注意区分。

如果用到了usebackq参数,则(set)("set")表示文件set,('set')表示字符串set,(`set`)表示命令set。
复制代码


完!

感谢,Thanks!

作者:iTech
出处:http://itech.cnblogs.com/

分享到:
评论

相关推荐

    linux Shell 开发常用脚本命令详解

    以下是对Linux Shell开发常用脚本命令的详解: 1. **Shell概述**: - 作为开发人员,学习Shell的主要原因是能够理解并修改运维人员编写的程序,同时可以通过编写简单的Shell脚本来提升开发效率,例如管理集群。 -...

    hbase shell命令详解

    HBase Shell支持批处理,可以将多条put、delete等命令放入一个数组,然后使用`batch commands_array`执行。 12. **区域管理(split)**: `split '表名', '行键'`将表按照指定行键分裂为两个区域,有助于数据分布...

    windows注册表命令详解

    ### Windows注册表命令详解 Windows注册表是操作系统中一个至关重要的数据库,用于存储系统和应用程序的设置信息。熟练掌握注册表命令对于系统管理员和高级用户来说至关重要。本文将详细介绍常用的注册表命令及其...

    批处理for命令详解

    ### 批处理for命令详解 #### 一、引言 在批处理脚本编写中,`for` 命令是极为重要的一个组成部分,尤其对于初学者而言,理解和掌握 `for` 命令的使用方法是提升技能的关键。本文将深入浅出地介绍 `for` 命令的各种...

    putty之pscp命令详解.docx

    Putty之pscp命令详解 Putty是一款免费的远程连接工具,提供了pscp命令用于文件传输。pscp命令是Putty安装包中的一个组件,用于在Windows平台下进行远程文件传输。下面是pscp命令的详细解释。 pscp命令的基本语法...

    Windows Shell 编程指南与实例

    《Windows Shell 编程指南与实例》是一本深入探讨Windows操作系统壳层编程技术的专业书籍。在Windows系统中,Shell指的是用户界面,它为用户提供与操作系统交互的环境,包括桌面、开始菜单、快捷方式等。Shell编程则...

    bat批处理常用命令详解

    在Windows操作系统中,批处理(Batch)是一种自动化执行一系列命令的方式,主要基于DOS命令行环境。批处理脚本通常以`.bat`或`.cmd`为扩展名,它允许用户一次性执行多个命令,节省时间和提高效率。下面我们将详细...

    Linux进程管理命令详解.pdf

    Linux进程管理命令详解 Linux进程管理命令详解是Linux操作系统中的一种重要概念。Linux系统可以同时启动多个进程,Linux进程管理命令是管理这些进程的命令。这些命令包括at、bg、&、fg、kill、crontab、jobs、ps、...

    Windows Batch

    ### Windows Batch知识点详解 #### 一、概述与背景 **批处理**是计算机科学领域一个重要的概念,尤其在Windows操作系统中扮演着关键角色。通过批处理脚本(或称为批处理文件),用户可以自动化一系列任务,提高...

    linuxShell脚本编写实验7报告.pdf

    本实验报告旨在通过 Shell 脚本编写实验,掌握基本的 Linux 系统应用与开发技术,包括 Shell 脚本编写的基本知识、变量的使用、命令行参数的引用、for 循环、while 循环、read 命令的使用,以及命令扩展功能的使用。...

    dos批处理命令详解

    ### DOS批处理命令详解 #### 一、Echo 命令 **功能**: Echo 命令用于在命令行窗口中显示消息。 **语法**: `echo [{on|off}] [message]` - `on` 或 `off`: 控制是否显示后续的命令提示符。 - `message`: 显示的消息...

    linuxShell脚本编写实验7报告参照.pdf

    本实验报告主要介绍了Linux Shell脚本编写的基本知识和应用,包括变量的使用、命令行参数的引用、for循环、while循环、read命令的使用、命令扩展功能的使用等。实验报告共分为四个部分,分别是使用bash的for循环语句...

    linux shell学习

    - 作为与 Unix/Linux 交互的主要手段之一,Shell 允许用户执行命令、管理文件和目录以及自动化任务。 - Shell 脚本可以简化复杂的任务,并允许重复执行相同的操作。 #### 二、Shell 的历史与特点 - **历史**:...

    Quick Batch File Compiler 3.1.5.0

    Quick Batch File Compiler 3.1.5.0是一款专门用于将批处理脚本(BAT文件)转换为可执行文件(EXE文件)的工具。这个软件版本提供了将批处理命令转化为独立可执行程序的能力,使得用户可以更方便地在没有CMD环境的...

    Quick Batch File Compiler(register)

    Quick Batch File Compiler是一款通过一次点击就可以将批处理文件转换成真正的可执行文件的程序,它可以毫无限制地运行于Windows 95/98/ME/2000/2003/XP/2003/Vista/7/8/10下。其用途是保护bat文件的源码不被破坏、...

    Quick Batch File Compiler v4.3.0.2 汉化(bat转exe)

    Quick Batch File Compiler 是一款奇妙的工具,它可以把批处理文件 (.bat、.cmd 格式) 换为真正的可执行程序 (.exe格式)。对于转换出来的程序,你可以自定义程序的图标以及版本信息等;批处理文件的内容还可以加密...

    Quick Batch File Compiler

    Quick Batch File Compiler 是一款奇妙的工具,它可以把批处理文件 (.bat、.cmd 格式) 换为真正的可执行程序 (.exe格式),它可以毫无限制地运行于 Win95/98/ME/2000/2003/XP 下。对于转换出来的程序,你可以自定义...

Global site tag (gtag.js) - Google Analytics