一个批处理文件N个知识点
程序员文章站
2022-04-15 19:38:10
...
@echo off ::Description: :: replace propValue of propFile ::Auther :: chenxh 20160421 ::Using ::replace propFile propName propValue ::e.g. ::replace e:\temp\prop.properties prop1 newValue :: :BEGIN /* 直接运行时,需要把注释段改成rem哦,下同。 知识点1: DOS变量 延迟扩展 对for及if程序块的变量延迟解释,如在for块内,给row变量动态设置值, 如果其后使用%row%访问,则为空值,必须使用!row!访问。而要让!xxx!生效 这里必须开启 延迟扩展的功能,对应后面有endlocal关闭这个特性 可以说这是DOS解决BUG的补丁之举了。 */ setlocal enabledelayedexpansion :: mkdir temp file rem /* 知识点2: 批参数替代增强,对批处理命令的入参数%1 %2 等进行替代增强,主要 包括以下几个: %~1 - 删除引号("),扩充 %1 %~f1 - 将 %1 扩充到一个完全合格的路径名 %~d1 - 仅将 %1 扩充到一个驱动器号 %~p1 - 仅将 %1 扩充到一个路径 %~n1 - 仅将 %1 扩充到一个文件名 %~x1 - 仅将 %1 扩充到一个文件扩展名 %~s1 - 扩充的路径指含有短名 %~a1 - 将 %1 扩充到文件属性 %~t1 - 将 %1 扩充到文件的日期/时间 %~z1 - 将 %1 扩充到文件的大小 */ set srcFile=%~f1 set propName=%2 set propValue=%3 /* 知识点3: 字符串替换。 set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1 set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2 echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2 echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2 echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2 echo %p:~0,3% #显示前3个字符,即aa1 echo %p:~-2% #显示最后面的2个字符,即b2 echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2 echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2 echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2 set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2 set /a p=39 #设置p为数值型变量,值为39 set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3 set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用 set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/? */ set tempFile=%srcFile:.=_temp.% if exist %tempFile% del %tempFile% /* 知识点4: 字符串切分,即关于tokens及delims的知识点,参见这篇:http://blog.sina.com.cn/s/blog_4b795cc10100ez8d.html 知识点5: findstr 查找字符串,默认空行会忽略,添加/n后,由于空行会带一个行号,因此空行也会 进入for循环了。 */ ::replace propValue of propName for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%srcFile%"') do ( /* 知识点6: 赋值符前后不能有空格!否则赋值不成功哦。这个坑搞了我半天才找到。 另:if ( ) else ( )这里的"("及")"又不必须关键字有空格,否则语法不正确 */ set row=%%j if [!row!] equ [] ( /* 知识点7: 输出一个空行 echo后直接带一个"." 不能有空格哦。echo " " 会带一个引号,不够完美。 */ rem echo blank row echo. >> %tempFile% ) else ( /* 知识点8: 判断字符串是否包含特定子字符串,用的是字符串替换的功能,仔细想想是不是很妙呢? */ rem find propName row if "!row:%propName%=!"=="!row!" ( echo !row! >> %tempFile% ) else ( echo %propName%=%propValue% >> %tempFile% ) ) ) move /y %tempFile% %srcFile% >nul endlocal @echo on
上一篇: 介绍一个好用的代码统计工具
下一篇: 什么是面向对象编程(OOP)
推荐阅读
-
由一个瀑布流导出对滚动条滚动距离,可视区尺寸,元素尺寸的内容的知识点
-
python 输入一个数n,求n个数求乘或求和的实例
-
N个txt文本轻松合并成一个 TXT文档合并技巧
-
一个菜鸟站长成长的N条做站经验总结
-
不能使用for循环,传入n和m,生成一个长度为n,每一项都是m的数组
-
java 构造一个n层树数据结构(只查询一次数据库)
-
【学习笔记】C语言习题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
-
大家嘴上说着AMD YES 其实一个个都用着N卡
-
php打印一个边长为N的实心和空心菱型的方法
-
CSS选取第一个、最后一个、偶数、奇数、第n个标签元素