当前位置: 首页 > news >正文

计算机技术基础 (bat 批处理)Note5

计算机技术基础 (bat 批处理)Note5

本节主要讲解 FOR 命令语句(循环)在 bat 批处理中的使用 (part 1)

FOR 命令语句

在批处理中,for 是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/减等操作更加简单,配合 ifcallgoto 等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作。
例子:
bat 文件

for %%i in (a,b,c,d,e) do @echo %%i
pause

结果:

C:\Users\rwq119\Desktop\test>for %i in (a b c d e) do @echo %i
a
b
c
d
eC:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

For 语句的基本要素都有:
(1) forindofor 语句的关键字,它们三个缺一不可
(2)in 之后, do 之前的括号不能省略
(3) %%ifor 语句中对定义变量 (定义变量 i) 的引用,就算它在 do 后面的语句中没有参与语句的执行,也是必须出现的。
但注意,在 cmd 里直接输入 for %%i in (a,b,c,d,e) do @echo %%i 是运行不了的。因为 for 循环的语法,在命令行(cmd 窗口)中直接输入时,应该使用单个百分号 % 来引用变量(即:for %i in (a,b,c,d,e) do @echo %i),而在批处理文件(.bat)中,应该使用双百分号 %%。这种差异主要是因为命令行和批处理文件的解析方式不同。在批处理文件中,% 字符是一个特殊的字符,用于变量替换,所以在批处理文件中引用循环变量时,需要用 %% 来避免与批处理文件的变量解析机制冲突。
(4)command1 表示字符串或变量,command2 表示字符串、变量或命令语句:DO command1 [command2]

For /f delims 命令

For /F 参数 命令语句,参数 /f 命令说明:读取文件内容;提取某几行字符;截取某个字符片段;对提取到的内容再切分、分割、等等…… for /f 就是被设计成专门用于解析文本的。
示例:
我们有以下文本文档(t.txt 文件)

a
a,
a
12,34
sa
fv`,
f/'v,45
'.,[.'/

使用以下 bat 文件读取文本文档的内容

for /f %%i in (t.txt) do @echo %%i
pause

结果会按行迭代,一行一行的打印出来:

C:\Users\rwq119\Desktop\test>for /F %i in (t.txt) do @echo %i
a
a,
a
12,34
sa
fv`,
f/'v,45
'.,[.'/C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

参数 delims= 是分割符,分割符后面的内容不要,比如逗号分割: for /f "delims=," %%i in (xxx.txt) do echo %%i
示例,我们还用上面的 t.txt,更改下 bat 文档

for /f "delims=,"  %%i in (t.txt) do @echo %%i
pause

结果依然是按行迭代,结果一行一行打印出来,但是行内如果有 ,,那之后的文本就会被分割掉。如果行内没有 , 那么这一行都会被打印,比如第一行的 a:

C:\Users\rwq119\Desktop\test>for /F "delims=," %i in (t.txt) do @echo %i
a
a
a
12
sa
fv`
f/'v
'.C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

For /f tokens 命令

命令说明:定点提取 tokens=
示例1, 我们有下面的 txt 文件:

1,2,3,4,5,6

bat 代码:

for /f "delims=, tokens=3"  %%i in (t.txt) do @echo %%i
pause

结果就是提取了以 , 分割的第三个字符(tokens= 可以用于指定提取哪一个)

C:\Users\rwq119\Desktop\test>for /F "delims=, tokens=3" %i in (t.txt) do @echo %i
3C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

示例2,依然是上面的 txt 文件:

for /f "delims=, tokens=1,3,6"  %%i in (t.txt) do @echo %%i %%j %%k
pause

我们可以看到依次提取出了 第 1,3,6个值。这里注意,我们定义变量 %%i,后面 do 里面调用就要连着使用,第二个变量(提取的原文档逗号分隔后的第三个值)用 %j,第三个变量(提取的原文档逗号分隔后的第6个值)用 %k, 即 i,j,k 要连着。如果我们定义变量 %%a 那么就要用 %%b %%c

C:\Users\rwq119\Desktop\test>for /F "delims=, tokens=1,3,6" %i in (t.txt) do @echo %i %j %k
1 3 6C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

示例3,依然是上面的 txt 文件:

for /f "delims=, tokens=3,*"  %%i in (t.txt) do @echo %%i %%j
pause

结果我们可以打印第三个,以及第三个后面所有的。这里 * 在 bat 文件中用法就是代表所有,%%j 就是对应的 *

C:\Users\rwq119\Desktop\test>for /F "delims=, tokens=3,*" %i in (t.txt) do @echo %i %j
3 4,5,6C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

示例4,我们有新文本 txt 文件:

a,
a
a,b
ab
1,2,3
1,2,3,4,5,6
a1,a2,a3,a4,a5,a6,a7

bat 文件:

for /f "delims=, tokens=2,3,*"  %%i in (t.txt) do @echo %%i %%j %%k
pause

结果,会对每行进行分割提取操作,打印出符合要求的变量。第一二四行以逗号分割后没有第二个值,什么也不会打印(打印空);第三行逗号分割后有第二个值,会被打印出来 b;第五行逗号分隔后会有第二个值 2 和第三个值 3 会被打印出来;第六七行对应的 %%i%%j%%k 都有,会被依次打印出来。

C:\Users\rwq119\Desktop\test>for /F "delims=, tokens=2,3,*" %i in (t.txt) do @echo %i %j %k
b
2 3
2 3 4,5,6
a2 a3 a4,a5,a6,a7C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

For /f skip 命令

命令说明:跳过文本内容(行) skip=
示例,这里我们用到的还是上文 tokens 命令的示例的 txt。
批处理文本:

for /f "skip=5"  %%i in (t.txt) do @echo %%i
pause

输出的结果会跳过前面5行:

C:\Users\rwq119\Desktop\test>for /F "skip=5" %i in (t.txt) do @echo %i
1,2,3,4,5,6
a1,a2,a3,a4,a5,a6,a7C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

批处理文本:

for /f "skip=1" %%i in (t.txt) do @echo %%i
pause

输出结果跳过第一行:

C:\Users\rwq119\Desktop\test>for /F "skip=1" %i in (t.txt) do @echo %i
a
a,b
ab
1,2,3
1,2,3,4,5,6
a1,a2,a3,a4,a5,a6,a7C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

For /f eol 命令

命令说明:忽略指定字符的文本内容(指定字符需要在文本首部)eol=
示例,我们有文本文档 txt 文件

a,
,a
(a,b
,ab
:1,2,
;3

bat 文件

REM for /f %%i "eol=," in (t.txt) do @echo %%i 无法运行,参数要在定义变量 %%i 之前。对于其他参数应该也是
for /f "eol=," %%i  in (t.txt) do @echo %%i
pause

结果,行首是 , 的行都会被忽略掉

a,
(a,b
:1,2,
;3C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

注意当我们不定义 eol= 参数的时候,行首是 ; 分号的行都会默认被忽略掉
bat 文件:

for /f %%i in (t.txt) do @echo %%i
pause

结果,我们虽然没有定义 eol=; 但是,分号开头的行都会被忽略。

C:\Users\rwq119\Desktop\test>for /F %i in (t.txt) do @echo %i
a,
,a
(a,b
,ab
:1,2,C:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

但是我们一旦定义了 eol=参数,如上面定义了 eol=, 就只会忽略 , 开头的行,; 开头的行也被打印。

For /f usebackq 命令

命令说明:增强型命令参数 usebackq
首先我们复习一下 for 语句参数 f 这个命令的使用格式
(1)for /f %%i in (文件名) do (......)
(2)for /f %%i in ('命令语句') do (......)[' ' 单引号]
(3)for /f %%i in ("字符串") do (......) [" " 双引号]
REM for /f %%i in (...) do echo %%i
(1)在之前的示例中已经示范过了,(2)命令语句加单引号 ' ' 的示例:
osk 命令是打开虚拟键盘
批处理文件:

for /f %%i in (osk) do @echo %%i
for /f %%i in ('osk') do @echo %%i
pause

运行后结果,第一行命令没有 单引号 ' ' 是会报错的,系统找不到这个文件。第二行命令打开了虚拟键盘。
在这里插入图片描述
对于(3)字符串加双引号 " " 的示例:

for /f %%i in ("osk") do @echo %%i
pause

输出结果,"osk" 被当作字符串打印出来

C:\Users\rwq119\Desktop\test>for /F %i in ("osk") do @echo %i
oskC:\Users\rwq119\Desktop\test>pause
Press any key to continue . . .

我们再介绍增强型命令参数 usebackq
语法:
(1)for /f "usebackq" %%i in ("文件名") do (.......)
(2)for /f "usebackq" %%i in (`命令语句`) do (.......) 注意这里用的是反单引号(反引号 (`xxx`))
(3)for /f "usebackq" %%i in (‘字符串’) do (.......)

区别于前面普通情况下文件名没有引号 (xxx),命令语句单引号 ('xxx'),字符串双引号 ("xxx")usebackq 的使用文件名要加双引号 ("xxx"),命令语句要加反引号 (`xxx`),字符串加单引号 ('xxx')
对于(1)使用 usebackq,可以读取名字里带有空格的文件名 比如 for /f "usebackq" %%i in ("文件名 有空格.txt") do (.......)

备注:
这个是自学 b 站up主 程序员血月做的笔记。原视频链接:
https://space.bilibili.com/327484473/channel/seriesdetail?sid=2069394
因本人水平有限,如有任何问题,欢迎大家批评指正!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CSS平面转换-旋转
  • NumPy 基础教程
  • 普通人有必要学Python吗?学了之后能做什么?
  • element-ui+vue2实现粘贴上传
  • 收银系统源码-分销商城视频介绍
  • 企业搭建SD-WAN组网有什么意义?
  • “光影魔术手”:一款让照片编辑更高效的软件工具
  • 自动化测试selenium
  • 最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台
  • 【时时三省】(C语言基础)函数递归
  • 体验教程:通义灵码陪你备战求职季
  • 文件审查流程:使用指南
  • js录制音频
  • httpx,一个网络请求的 Python 新宠儿
  • 24年电赛——自动行驶小车(H题)基于 CCS Theia -陀螺仪 JY60 代码移植到 MSPM0G3507(附代码)
  • @jsonView过滤属性
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • cookie和session
  •  D - 粉碎叛乱F - 其他起义
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java的Interrupt与线程中断
  • js数组之filter
  • js中forEach回调同异步问题
  • linux安装openssl、swoole等扩展的具体步骤
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Vue2.x学习三:事件处理生命周期钩子
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 经典排序算法及其 Java 实现
  • 入手阿里云新服务器的部署NODE
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微服务框架lagom
  • 微信公众号开发小记——5.python微信红包
  • 温故知新之javascript面向对象
  • 线上 python http server profile 实践
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (k8s中)docker netty OOM问题记录
  • (SERIES12)DM性能优化
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (过滤器)Filter和(监听器)listener
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (算法)硬币问题
  • (转)mysql使用Navicat 导出和导入数据库
  • (转载)深入super,看Python如何解决钻石继承难题
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net Redis的秒杀Dome和异步执行
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter