[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 脚本学习备忘录(仅自阅,谢绝回复)

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

move 与rd 2楼if 语句的小陷阱 4楼
启动应用程序
findstr可以完全替代find吗?5楼
call与goto对标签的调用 ren 通配符的使用 6楼
文件筛选:for /r与dir3楼
BAT开发第三方命令行
字符串的替换

QQ 33892006

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调用标签,标签前面都加冒号:
QQ 33892006

TOP

本帖最后由 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部分不支持转义,这是它的问题所在。**
QQ 33892006

TOP

本帖最后由 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. )
复制代码
QQ 33892006

TOP

本帖最后由 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支持正则,可同时查找多个关键,比如
    1. 在list.txt中查找包含"张三"或"李四"的行
    2. findstr /r "张三 李四" list.txt
    3. 测试结果:
    4. 张三
    5. 李四
    6. 张三 李四
    复制代码

    1. findstr /c:"张三 李四" list.txt
    2. 结果:
    3. 张三 李四
    4. find "张三 李四"<list.txt   也能得到相同结果
    复制代码
    1. findstr /r /c:"D:\test\测试用PPT.pptx" list.txt
    2. findstr /l /c:"D:\test\测试用PPT.pptx" list.txt
    3. 结果:空
    4. findstr /r /c:"D:\test\test测试用PPT.pptx" list.txt
    5. 结果:空
    6. findstr /l /c:"D:\test\test测试用PPT.pptx" list.txt
    7. 结果:D:\test\test测试用PPT.pptx
    8. 不确定的结论:
    9. /R参数是正则表达,此时\是元字符的转义符,所以表达式中根本不存在\这个符号,自然匹配不到结果
    10. /L参数,去正则,让字符转为普通字符.理论上应该可以找到匹配结果;意外的是,如果\与汉字相邻,匹配失败;只有\与非汉字字符相邻,才能匹配成功.真是莫名其妙.
    11. 如果将匹配表达式的中\换成\\,那无论是findstr /l 或findstr /r ,无论表达式中\有没有与汉字相邻都没有影响.
    12. 在正则中\\是表示普通字符\,前面的\是转义.由此可知,/L参数去正则并不完全.
    复制代码


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

TOP

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

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

TOP

返回列表