bat批处理 for循环_批处理 for /f

bat批处理 for循环_批处理 for /f一、前言在批处理中,for是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/递减等操作成为可能;配合if、call、goto等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作;合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦。二、for语句的基本用法1、举例:正如色彩缤纷的七彩光芒是由红绿蓝三原色构成的一样,最复杂的for语句,也…


Jetbrains全系列IDE稳定放心使用

一、前言

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

二、for语句的基本用法

1、举例:

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

在cmd窗口中:

FOR %variable IN (set) DO command [command-parameters]

在批处理文件中:

FOR %%variable IN (set) DO command [command-parameters]

具体例子:

For %i in (1 2 3) do @echo %i

bat批处理 for循环_批处理 for /f

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

2、for语句的基本要素都有些什么:

  1、for、in和do是for语句的关键字,它们三个缺一不可;
  2、%%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;
  3、in之后,do之前的括号不能省略;
  4、command1表示字符串或变量,command2表示字符串、变量或命令语句;

3、精髓:

1、for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0 ~%%9中的任意一个;
 2、in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;
3、for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行;并且每次只提取一个元 素,然后执行一次do后的命令语句,而无论这个元素是否被带到command2中参与了command2的运行;当执行完一次do后的语句之后,再提取 command1中的下一个元素,再执行一次command2,如此循环,直到command1中的所有元素都已经被提取完毕,该for语句才宣告执行结 束;

其中,第3点是最为关键的,它描述了for语句的执行过程,是for语句的精髓所在,大家一定要牢记这一条,才能深刻理解更为复杂的for流程。

见识一下for的真正威力,检测当前硬盘都有哪些分区:

@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo current local disk:
for %%i in (%str%) do if exist %%i: echo %%i:
pause

这段代码能检测硬盘都有哪些分区,包括U盘和移动硬盘的分区,但是,当光驱中有盘的时候,也会被列出来,这是本代码的一个缺憾,在以后的讲解中,我将向大家讲述如何消除这个瑕疵,敬请关注本系列的后续章节。

高级应用:

列出当前目录下所有的文本文件:

@echo off
for %%i in (*.txt) do echo %%i
pause

列出只用两个字符作为文件名的文本文件:

@echo off
for %%i in (??.txt) do echo "%%i"
pause

3、检测文件大小并运行:

检测当前目录指定文件 temp.txt 如果这个文件大于500KB执行A 小于500KB则执行B

@echo off
for %%i in ("%~dp0\temp.txt") do (
set indexdx=%%~zi
)
if %indexdx% gtr 512000 (
rem 执行A命令
echo biger 512
)else (
rem 执行B命令
echo less 512
)
pause

4、将循环变量赋值给一个变量

https://blog.csdn.net/nodeman/article/details/45691863

预处理机制:批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。在不启用变量延迟,也不对变量动态捕获其扩展变化时,变量在预处理阶段不作改变

setlocal enabledelayedexpansion ,就是启用变量延迟,我们可以形象的认为是启用了“对变量动态捕获扩展变化”。而 ! 括起来的变量,就是要动态捕获扩展的目标变量,如果不需要,可以继续使用 % 括变量。
 

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION 
for /l %%i in (1 1 10) do (
    set var=%%i
   echo ----- !var! 启用延缓环境变量
   echo 00000 %var% 未启用延缓环境变量
)

pause 

 

bat批处理 for循环_批处理 for /f

通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。

1)无开关

无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:

FOR %%variable IN (set) DO command

其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。

无开关for语句举例:

@echo off

for %%i in (a,"b c",d) do echo %%i

::pause >nul 将命令的输出重定向到 nul这个空设备,不会显示任何内容
::pause >nul 表示暂停,但不在屏幕上显示提示信息
pause>nul 

结果:

bat批处理 for循环_批处理 for /f

2)开关/L  (start,step,end)  step=<end

含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:

FOR /L %%variable IN (start,step,end) DO command

其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。

含开关/L的for语句举例(创建5个文件夹):

@echo off
for /l %%i in (1,2,10) do md %%i
pause

结果:

bat批处理 for循环_批处理 for /f

 

未完待续。。。

参考文章:

https://www.cnblogs.com/DswCnblog/p/5435300.html

https://baike.baidu.com/item/%E6%89%B9%E5%A4%84%E7%90%86/1448600?fr=aladdin#5_2

https://www.w3cschool.cn/dosmlxxsc1/wvqyr9.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184041.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • to program_I Just Want To

    to program_I Just Want To在http://forum.doom9.org/showthread.php?t=109747上看到的一篇文章,讲得不错,翻译一下,以作备忘。原文是:InX264therearetwodeblockingparameters,calledDeblockingstrengthandDeblockingthreshold.Thestrengthp

    2022年9月19日
  • Java的几个版本

    Java的几个版本一、JavaSE(JavaPlatform,StandardEdition)JavaSE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持 JavaWeb服务开发的类,并为JavaPlatform,EnterpriseEdition(JavaEE)提供基础。二、JavaEE(JavaPlatform,EnterpriseEdition) 这个版本以前称为J2EE。企业版本帮助开发和部署可移植

    2022年7月8日
  • 二维数组分组:按照一个键值,按照多个键值

    二维数组分组:按照一个键值,按照多个键值

    2021年10月9日
  • mysql8.0.25安装配置教程(windows 64位)最详细

    目录1.官网下载MySQL2.配置初始化文件my.ini3.初始化MySQL4.安装mysql服务并启动+修改密码5.配置环境变量6.部分疑难杂病7.使用连接工具连接mysql1.官网下载MySQL下载Mysql点击下载mysql.下载完成后解压到某一个文件夹(记住这个路径,一会要用到)2.配置初始化文件my.ini在根目录下创建一个txt文件,名字叫my,文件后缀为ini之后复制下面这个代码放在文件下(新解压的文件没有my.ini文件,需自行创建)以下代码除安装目录和数据的存放目录需修

    2022年4月5日
  • 图像处理-激光测距技术&工业相机基本原理概述「建议收藏」

    图像处理-激光测距技术&工业相机基本原理概述「建议收藏」激光测距技术与一般光学测距技术相比,具有操作方便、系统简单及白天和夜晚都可以工作的优点.与雷达测距相比,激光测距具有良好的抗干扰性和很高的精度,而且激光具有良好的抵抗电磁波干扰的能力,尤其在探测距离较长时,激光测距的优越性更为明显.激光测距技术是指利用射向目标的激光脉冲或连续波激光束测量目标距离的距离测量技术.比较常用的激光测距方法有脉冲法、相位法、三角法和干涉法激光测距.本文主要探讨下激光三角法的基本原理和工业相机原理:1.1激光三角法的基本原理光电技术的快速发展,以及计算.

    2022年5月30日
  • 跨域访问解决及原因分析_为什么会有跨域问题

    跨域访问解决及原因分析_为什么会有跨域问题转自:https://www.cnblogs.com/itmacy/p/6958181.html跨域问题:解决跨域的三种方案当前端页面与后台运行在不同的服务器时,就必定会出现跨域这一问题,本篇简单介绍解决跨域的三种方案,部分代码截图如下,仅供参考:方式一:使用ajax的jsonp前端代码 服务器代码 使用该方式的缺点:请求方式只能是get请求方式二:使用jQuery的jsonp插件…

    2022年9月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号