Board logo

标题: [其他] 脚本学习备忘录(仅自阅,谢绝回复) [打印本页]

作者: 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与dir3楼
BAT开发第三方命令行
字符串的替换


作者: yhcfsr    时间: 2018-5-25 16:39

move 与rd
移动A目录中123.mp4至目录B,然后删除目录A。
  1. move "A\123.mp4" "B"
  2. rd /s /q "A"
复制代码
**只有在move完成后,才会执行rd,因此不用担心会发生“出师未捷身先死”的悲剧。**

启动应用程序
  1. start "" "A\a.exe"
  2. echo;已启动a.exe
  3. pause
复制代码
**执行start后,立即执行后面的语句**
  1. "A\a.exe"
  2. echo;已启动a.exe
  3. pause
复制代码
**启动a.exe,然后等待a.exe结束;当a.exe结束后,才会执行后面的语句。某些情况下,这会很有用。**

call与goto对标签的调用
  1. @echo off
  2. call:lable
  3. echo;main program.
  4. pause&exit
  5. :lable
  6. echo;lable code
  7. pause
复制代码
运行结果:


**call 语句结束后,接着执行主程序的后续语句。**
  1. @echo off
  2. goto:lable
  3. echo;main program.
  4. pause&exit
  5. :lable
  6. echo;lable code
  7. pause
复制代码
运行结果:


**goto跳转到lable标签,执行:lable后的代码,goto与:lable之间的代码全都不会再执行**

我想买支笔写作业,call是打电话叫老板送过来,你自己不用出门(仍在主程序位置不动),拿到笔后可以立即写作业(执行call后续语句)。
goto是自己去商店买,拿到笔后,除非你再goto回来,否则你就一去不返、离家出走了。
  1. 你可以 goto:lable
  2. 也可以 goto :lable   (有空格)
  3. 也可以 goto lable    (有空格)
  4. 不可以 gotolable
  5. 你可以 call:lable
  6. 也可以 call :lable    (有空格)
  7. 不可以 call lable
  8. 不可以 calllable
复制代码
为了不混乱,call与goto调用标签,标签前面都加冒号:
作者: yhcfsr    时间: 2018-5-26 15:56

本帖最后由 yhcfsr 于 2018-5-30 00:19 编辑

文件筛选:for /r与dir的应用
问题:寻找当前目录及子目录中所有包含关键aaa或bbb的jpg或bmp文件
  1. dir /a-d/s/b "*aaa*" "*bbb*"|findstr /e ".jpg .bmp"
复制代码
用for /r 来实现有点复杂,for的集合需要枚举 (关键字数量X类型数量) 个元素,不如dir灵活
  1. 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中字符串 /<>&# 删除
  1. for /f "tokens=1,* delims=:" %%a in ('findstr /n ".*" "test.txt"') do (
  2.         set "var=%%b"
  3.         setlocal enabledelayedexpansion
  4.         set "var=!var:/<>&#=!"
  5.         echo;!var!
  6.         endlocal
  7. )
  8. pause
复制代码


**如果用上面的代码尝试替换掉文本中的=、%、!,只怕要失望。set "var=!var:XXX=!",XXX部分不支持转义,这是它的问题所在。**
作者: yhcfsr    时间: 2018-6-7 00:43

本帖最后由 yhcfsr 于 2018-6-7 00:46 编辑

if 语句的小陷阱
  1. if 3==2 echo;yes else echo;no
复制代码
理论上应该输出no。实际并没有。
  1. if 2==2 echo;yes else echo;no
复制代码
居然输出  yes else echo;no
也就是else 的关键词功能丧失,成了普通字符串。
结论:正确语法如下
  1. if 2==2 (echo;yes) else echo;no
  2. 或者
  3. if 2==2 (echo;yes) else (echo;no)
  4. 或者
  5. if 2==2 (echo;yes) else (
  6.     echo;no
  7. )
复制代码
当然如果 if 单用,加不括号都无所谓.不过下面的括号不能少:
  1. if 2==2 (
  2.     语句1
  3.     语句2
  4.     ......
  5. )
复制代码

作者: yhcfsr    时间: 2018-6-7 12:04

本帖最后由 yhcfsr 于 2018-6-7 12:57 编辑

findstr可以完全替代find吗?
list.txt
  1. 张三
  2. 李四
  3. 张三 李四
  4. D:\test\测试用PPT.pptx
  5. D:\test\test测试用PPT.pptx
复制代码


不管怎么说,可以得出一个结论:
如果希望用正则匹配表达式,就用findstr /r;
如果不希望用正则,按普通字符串匹配,就用 find.

作者: yhcfsr    时间: 2018-6-16 12:44

本帖最后由 yhcfsr 于 2018-6-16 12:45 编辑

ren 通配符的使用
  1. ::把当前目录下"_1"后缀的文件,重命名为"目录.txt"
  2. ren "*_1.txt" "目录.txt"
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2