FOR函数,对一组文件批量执行命令,基本模式如下
1.文件搜索 for [/D] [/R [路径]] %%变量 in (集合) do (命令)
2.等差数列 for /L %%变量 in (开始,间隔,结束) do (命令)
3.文本处理 for /F ["选项"] %%变量 in (集合) do (命令)

文件搜索

命令用法:for [/D] [/R [路径]] %%变量 in (集合) do (命令)
/D 只搜索文件夹名[可选],若无该选项即为 只搜索文件名
/R [路径] 搜索子目录[可选],如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
路径 搜索指定目录[可选]
%%变量 可以是一个字母(不区分大小写),数字,或符号,用于在命令中使用,代表搜索结果。在若是在命令行中用%(一个),批处理程序中使用 FOR 命令时,指定变量使用 %%(两个)。
集合 指定一个或一组文件。可以使用通配符搜索。(允许指定多个搜索条件 用空格分隔 "带空格 的搜索条件用双引号括住")(当搜索条件不包含通配符时 不搜索直接输出 因此也可以用来指定文本 用空格分隔 "带空格 文本用双引号括住")
命令   指定批量执行的命令。使用%%变量 指定搜索结果。
 
例1、显示当前文件夹(不含子文件夹)下所有bat文件的文件名
for %i in (*.bat) do echo %i
 
例2、计算game目录下及所有子目录下一共有多少文件
for /r game %i in (*) do set a+=1
 
例3、计算多个数字的乘积
@echo off
:start
set /p n=请输入多个数字,用空格隔开:
set c=1
for %%i in (%n%) do set /a c*=%%i
echo %a%的乘积为%c%
goto :start
 
注意:for搜索并不会搜索隐藏文件
 

等差数列

命令用法:for /L %%变量 in (开始,间隔,结束) do (命令)
(开始,间隔,结束)表示从开始到结束的一个数列,间隔为数列差。因此,(1,2,10)将产生序列(1 3 5 7 9),(5,-1,1)将产生序列(5 4 3 2 1)
 
例1、连续打开十个cmd窗口
for /l %i in (1,1,10) do start cmd
 
例2、生成一个间隔为100-500的数列,间隔为5
for /l %i in (100,5,500) do echo %i
 
例3、计算阶乘
@echo off
:start
set /p n=请输入数字:
set c=1
for /l %%i in (1,1,%n%) do set /a c*=%%i
echo %n%的阶乘是%c%
goto :start
 

文本处理

命令用法:for /F ["选项"] %%变量 in (集合) do (命令)
多个选项用空格分开,整体必须用双引号括起来。
eol=!  指定注释符号。默认未指定。(忽略以!开头的行)
skip=n  忽略第0-n行。默认为0(不忽略)
delims= -x 指定列分隔符,可指定多个。(将空格 减号-字母x指定为列分隔符)(默认分隔符为空格 制表符)(所谓制表符,打开记事本,按TAB键)
tokens=1,7-9* 读取第几列。默认为1。若命令为for /F "tokens=参数" %%a in (集合) do (命令)
当参数为1,7 变量a为第1列的内容,变量b为第7列的内容
当参数为7-9变量a为第7列的内容,变量b为第8列的内容,变量c为第9列的内容
当参数为9*变量a为第9列的内容,变量b为第9列之后所有列的内容
当参数为*变量a为所有列的内容。
当参数为1,7-9* 变量a为第1列的内容,变量b为第7列的内容,变量c为第8列的内容,变量d为第9列的内容,变量e为第9列之后所有列的内容。
看完这些,你已经明白tokens=怎么使用了吧?记住可用的三个符号,-*
usebackq 指定新语法。示范:for /F "usebackq" %%a in (集合) do (命令)
(集合) 指定一个或一组文件。可以使用通配符。(也可以指定文本或命令。)
usebackq 未启用  (一个或一组文本文档)   ("文本")    ('命令输出')
            (*.txt)     ("第一行 1,2 1,3 1,4") ('dir /as /b')
usebackq 已启用  ("一个或一组文本文档")   ('文本')    (`命令输出`)
            ("*.txt")     ('第一行 1,2 1,3 1,4') (`dir /as /b`)
"双引号" '单引号' `反单引号`
你可能觉得usebackq是一个可有可无,没有实际作用的选项?不要忘了,如果文件名中有空格,我们必须用双引号括起来!显然这会造成识别为文本……怎么办?启用usebackq呗~
额,说到这里,可能你还没弄懂for /F到底是啥……嗯,那就解释一下。
集合可以是  一个或一组文件(文本文档) 或 "引号括起来的文本" 或 '命令输出'
(*.txt) ("第一行 1,2 1,3 1,4") ('dir /as /b')
然后这些文本会逐行作为 %%变量 进行输出
使用上方的选项设置,可以做到……忽略以某符号开始的行 和 忽略开头的数行 和 指定列分割符 和 只读取每行中的指定列。
多的不说,直接贴代码
 
例、
@echo off
echo 第一行! 1,2 1,3 1,4 >test.txt
echo 第二行! 2,2 2,3 2,4 >>test.txt
echo 第三行! 3,2 3,3 3,4 >>test.txt
echo 第四行! 4,2 4,3 4,4 >>test.txt
echo 在当前文件夹下生成了一个test.txt,内容为:
for /F "delims=" %%i in (test.txt) do echo %%i
echo 这个文件的第一列是:&pause>nul
for /F %%i in (test.txt) do echo %%i
echo 这个文件的第二列是:&pause>nul
for /F "tokens=2" %%i in (test.txt) do echo %%i
echo 这个文件的第三和第四列是:&pause>nul
for /F "tokens=3-4" %%a in (test.txt) do echo %%a %%b
echo 这个文件的第二行是:&pause>nul
for /F "skip=1 delims=" %%i in (test.txt) do echo %%i&goto 1
:1
pause&cls&echo 一大波僵尸即将袭来&pause&tasklist
echo 去掉以上内容的前三行,仅保留第一列 & pause>nul
for /f "skip=3" %%i in ('tasklist') do echo,%%i
pause>nul
 
 
扩展:setlocal enabledelayedexpansion
设置本地为延迟扩展。其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!
为了更好的说明问题,我们先引入一个例子。
例1、
@echo off set a=4 set a=5&echo %a% pause
结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?让我们先了解一下批处理运行命令的机制:批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5&echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。那么如何开启变量延迟呢?变量延迟又需要注意什么呢?
 
举个例子说明一下:
@echo off 
set a=4 
set a=5&echo %a% 
pause
 
解说:由于启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为4,“set a=5&echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。
 
例、查询本机计算机记录的wifi密码:
@echo off
:start
echo.> 1.txt
set c=
set n=
setlocal enabledelayedexpansion 
echo 在本地计算机记录的wifi:
for /f "skip=3 tokens=2*" %%i in ('netsh wlan show profiles') do set /a c+=1 &echo !c!  %%j&echo !c! %%j>>1.txt
set /p n=请输入序号查看的wifi密码:
for /f "tokens=1* skip=%n%" %%i in (1.txt) do (
set var=%%j
echo %%j的密码是
netsh wlan show profiles name="%%j" key=clear | findstr 关键内容
goto :cc)
:cc
pause
cls
goto :start
 

CMD批处理(4)——批处理循环语句结构的更多相关文章

  1. Lua中的常用语句结构以及函数

     1.Lua中的常用语句结构介绍 --if 语句结构,如下实例: gTable = {} ] ] then ]) == gTable[] then ]) else print("unkown ...

  2. shell编程之循环语句for / while / until

    shell编程之循环语句与函数 一.条件测试 二.循环语句 ① for循环语句结构(遍历) 示例1 示例2 ② while循环语句结构(迭代) 示例1 示例2 ③ until 循环语句结构 示例1 一 ...

  3. Shell循环语句for、while、until

    Shell循环语句for.while.until            一.条件测试            二.删除字符            三.循环语句              示例1     ...

  4. 批处理学习:for语句详解【经典】

    大纲 一 前言 二 for语句的基本用法 三 for /f (delims.tokens.skip.eol.userbackq.变量延迟) 四 for /r (递归遍历) 五 for /d (遍历目录 ...

  5. 【转】dos下 和 批处理中的 for 语句的基本用法

    for 语句的基本用法 : 最复杂的for 语句,也有其基本形态,它的模样是这样的:   在cmd 窗口中:for %I in (command1) do command2 在批处理文件中:for % ...

  6. dos下 和 批处理中的 for 语句的基本用法

    for 语句的基本用法 : 最复杂的for 语句,也有其基本形态,它的模样是这样的:   在cmd 窗口中:for %I in (command1) do command2 在批处理文件中:for % ...

  7. 批处理学习:for语句详解

    大纲 一 前言 二 for语句的基本用法 三 for /f (delims.tokens.skip.eol.userbackq.变量延迟) 四 for /r (递归遍历) 五 for /d (遍历目录 ...

  8. 转载解决:错误的语法:”XXXX“必须是批处理中仅有的语句

    SQL Server 数据库提示“错误的语法:”XXXX“必须是批处理中仅有的语句”报错的原因分析 解析:批处理必须以 CREATE 语句开始.也就是说一个查询分析器里面只有一个批处理语句才是规范的语 ...

  9. 解决:错误的语法:”XXXX“必须是批处理中仅有的语句

    原文:解决:错误的语法:”XXXX“必须是批处理中仅有的语句   SQL Server 数据库提示“错误的语法:”XXXX“必须是批处理中仅有的语句”报错的原因分析 解析:批处理必须以 CREATE ...

随机推荐

  1. C++的指针相关概念

    引言 初入c++,肯定会对指针这个概念非常熟悉.但是为什么c/c++要使用指针? 其实每一种编程语言都使用指针,指针并不只是C/C++的独有特性.C++将指针暴露给了用户(程序员),而Java和C#等 ...

  2. Java线程池的工作流程

    线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源.在调用execute()添加一个任务时,线程池会按照以下流程执行: 1.如果正在运行的线程数少于corePoolSiz ...

  3. [刷题] 237 Delete Nodes in a Linked List

    要求 给定链表中的一个节点,删除该节点 思路 通过改变节点的值实现  实现 1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(in ...

  4. iPhone手机怎么和电脑互传文件,一条数据线搞定

    官方的方法是,通过iTunes进行文件的传输.传个文件还要特意安装个iTunes,实在是麻烦. 其实我们只需要在苹果应用商店app store下载Documents这个文件就可以. 另外,Docume ...

  5. HDFS 的内存存储是什么?

    引言 HDFS 的定位就是一个文件系统,用于存储文件,而 HDFS 对于文件的存储方式有两种: 内存存储 异构存储 内存存储 什么是内存存储? 首先,我们来了解一下到底什么是 "内存存储&q ...

  6. DOCKER学习_016:Docker镜像仓库和HARBOR的简单安装和管理

    一 镜像仓库介绍 1.1 简介 镜像仓库用于存放 Docker镜像 Docker registry提供镜像仓库服务 一个 Docker registry可以包含多个镜像仓库 仓库分为公共镜像仓库与私有 ...

  7. MyBaits 全局配置文件(mybatis-config.xml)

    什么是 MyBatis 全局配置文件 MyBatis 全局配置文件包含影响 MyBatis 框架正常使用的功能设置和属性信息. 它的作用好比手机里的设置图标,点击这个图标就可以帮助我们查看手机的属性信 ...

  8. 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据

    灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...

  9. HTTP状态 500 - 内部服务器错误之Could not open ServletContext resource [/db.properties]或者 [/mybatis.xml]

    报错原因是因为找不到db.properties或者mybatis.xml,但是我明明写了有.找了一下,才发现spring-dao.xml里面这两个配置文件地址有问题 Maven项目,applicati ...

  10. Locust入门

    Locust入门   Locust是一款Python技术栈的开源的性能测试工具.Locust直译为蝗虫,寓意着它能产生蝗虫般成千上万的并发用户: Locust并不小众,从它Github的Star数量就 ...