标题: [其他] 脚本学习备忘录(仅自阅,谢绝回复) [打印本页]
作者: yhcfsr 时间: 2018-5-25 10:39 标题: 脚本学习备忘录(仅自阅,谢绝回复)
本帖最后由 yhcfsr 于 2018-6-16 12:46 编辑
move 与rd | 2楼 | if 语句的小陷阱 | 4楼 |
启动应用程序 |
| findstr可以完全替代find吗? | 5楼 |
call与goto对标签的调用 | | ren 通配符的使用 | 6楼 |
文件筛选:for /r与dir | 3楼 | | |
BAT开发第三方命令行 | | | |
字符串的替换 | | | |
| | | |
作者: yhcfsr 时间: 2018-5-25 16:39
move 与rd
移动A目录中123.mp4至目录B,然后删除目录A。- move "A\123.mp4" "B"
- rd /s /q "A"
复制代码
**只有在move完成后,才会执行rd,因此不用担心会发生“出师未捷身先死”的悲剧。**
启动应用程序- start "" "A\a.exe"
- echo;已启动a.exe
- pause
复制代码
**执行start后,立即执行后面的语句**- "A\a.exe"
- echo;已启动a.exe
- pause
复制代码
**启动a.exe,然后等待a.exe结束;当a.exe结束后,才会执行后面的语句。某些情况下,这会很有用。**
call与goto对标签的调用
- @echo off
- call:lable
- echo;main program.
- pause&exit
- :lable
- echo;lable code
- pause
复制代码
运行结果:
**call 语句结束后,接着执行主程序的后续语句。**
- @echo off
- goto:lable
- echo;main program.
- pause&exit
- :lable
- echo;lable code
- pause
复制代码
运行结果:
**goto跳转到lable标签,执行:lable后的代码,goto与:lable之间的代码全都不会再执行**
我想买支笔写作业,call是打电话叫老板送过来,你自己不用出门(仍在主程序位置不动),拿到笔后可以立即写作业(执行call后续语句)。
goto是自己去商店买,拿到笔后,除非你再goto回来,否则你就一去不返、离家出走了。- 你可以 goto:lable
- 也可以 goto :lable (有空格)
- 也可以 goto lable (有空格)
- 不可以 gotolable
- 你可以 call:lable
- 也可以 call :lable (有空格)
- 不可以 call lable
- 不可以 calllable
复制代码
为了不混乱,call与goto调用标签,标签前面都加冒号:
作者: yhcfsr 时间: 2018-5-26 15:56
本帖最后由 yhcfsr 于 2018-5-30 00:19 编辑
文件筛选:for /r与dir的应用
问题:寻找当前目录及子目录中所有包含关键aaa或bbb的jpg或bmp文件- dir /a-d/s/b "*aaa*" "*bbb*"|findstr /e ".jpg .bmp"
复制代码
用for /r 来实现有点复杂,for的集合需要枚举 (关键字数量X类型数量) 个元素,不如dir灵活- for /r %%a in (*aaa*.jpg *bbb*.jpg *aaa*.bmp *bbb*.bmp) do echo;%%a
复制代码
BAT开发第三方命令行
原理很简单,先将BAT文件写好,然后用BAT转EXE工具将BAT文件转换成EXE,就可以在BAT中调用了。其中的难点是参数的判定,如果参数很多,判定过程可能很复杂。
目前所知不多,待进一步研究。
字符串的替换
BAT最怕和特殊字符(^&<>|~=!%)打交道。通过下面的代码可规避大部分特殊字符(不包括!=%)带来的麻烦,示例功能:将test.txt中字符串 /<>&# 删除- for /f "tokens=1,* delims=:" %%a in ('findstr /n ".*" "test.txt"') do (
- set "var=%%b"
- setlocal enabledelayedexpansion
- set "var=!var:/<>&#=!"
- echo;!var!
- endlocal
- )
- pause
复制代码
**如果用上面的代码尝试替换掉文本中的=、%、!,只怕要失望。set "var=!var:XXX=!",XXX部分不支持转义,这是它的问题所在。**
作者: yhcfsr 时间: 2018-6-7 00:43
本帖最后由 yhcfsr 于 2018-6-7 00:46 编辑
if 语句的小陷阱- if 3==2 echo;yes else echo;no
复制代码
理论上应该输出no。实际并没有。- if 2==2 echo;yes else echo;no
复制代码
居然输出 yes else echo;no
也就是else 的关键词功能丧失,成了普通字符串。
结论:正确语法如下- if 2==2 (echo;yes) else echo;no
- 或者
- if 2==2 (echo;yes) else (echo;no)
- 或者
- if 2==2 (echo;yes) else (
- echo;no
- )
复制代码
当然如果 if 单用,加不括号都无所谓.不过下面的括号不能少:- if 2==2 (
- 语句1
- 语句2
- ......
- )
复制代码
作者: yhcfsr 时间: 2018-6-7 12:04
本帖最后由 yhcfsr 于 2018-6-7 12:57 编辑
findstr可以完全替代find吗?
list.txt- 张三
- 李四
- 张三 李四
- D:\test\测试用PPT.pptx
- D:\test\test测试用PPT.pptx
复制代码
不管怎么说,可以得出一个结论:
如果希望用正则匹配表达式,就用findstr /r;
如果不希望用正则,按普通字符串匹配,就用 find.
作者: yhcfsr 时间: 2018-6-16 12:44
本帖最后由 yhcfsr 于 2018-6-16 12:45 编辑
ren 通配符的使用
- ::把当前目录下"_1"后缀的文件,重命名为"目录.txt"
- ren "*_1.txt" "目录.txt"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |