Windows bat脚本编程语法和经验

本文使用先注释说明经验后用代码说明的方式一段段记录

* bat脚本注释符号有::或者rem等,置于句首注释本行

* bat脚本分cmd命令和脚本文件,同样的命令在符号写法上会有稍微的区别,如重定向符 >和 >>等

 

::表示在此语句后所有运行的命令都不显示命令行本身,echo on  表示在此语句后所有运行的命令都显示命令行本身,@加在每个命令行的最前面,表示运行时不显示这一行的命令行
@echo off

::bat脚本一行只能有一个命令,甚至结束空格还必须放下一行,但使用了变量延迟扩展命令之后可以一行多个命令,但不建议使用。
setlocal enabledelayedexpansion

::后续命令使用的是:UTF-8编码
chcp 65001

::echo 表示输出后面的字符串
echo 中文

::%cd%代表当前路径
echo 当前路径为: %cd%

:: 输出文件目录的树形结构到文件
tree F: > tree_list.txt

:: rem注释中不能使用重定向符和管道符
rem 显示文本内容
type tree_list.txt

rem 搜索当前目录下所有的文本文件
rem for循环中可以给变量赋值但不能使用,只能调用常量或%%i,就是说刚赋值的变量变化不会体现。if句中也是!!!
rem 刚赋值的变量变化不会体现。if句中也是!
rem 直接分析字符串要加引号!!
rem for循环do的括号的内容一定不要放到和for同一行,
rem 因为bat脚本会强识别到空格,如果最后一句是赋值语句跟了空格和括号会多赋一个空格到变量中去,且很难发现错误!!!!!
rem for循环中/f参数是比较常用的,用于按序取出文件中行交给后续处理
for %%i in (*.txt) do echo "%%i"

::echo=输出空白行
echo=

rem /p 是让你输入
rem /a 命令行开关指定等号右边的字符串为被评估为数字表达式。
set sumRows=0
set /a sumRows+=1

rem "tokens=x,y"   判断x列,输出y列.
rem eol=#          #开头的行为注释行
rem tokens=1,3*    将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k (其中变量字母包括%%i必须按顺序且连续),*代表后面切分开的依次赋给顺延%%变量
rem delims=,-     (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后
rem if 语句后,括号前,必须加空格,否则语法错误!!!
rem bat脚本对于空格是强识别的,不会当成缩进!!!所以,该有空格的地方必须有且不要多!最好是语法结构写规范!
rem skip=10 跳过前10行(貌似不包括空行)
for /f "eol=# skip=10 tokens=1,2,3 delims=, " %%i in (userdata.txt) do (
    if %%i==%numberOfRows% (
        set name=%%j
        set buildFingerprint=%%k
    )
)

rem for循环/r参数之后还可带盘符及路径,如显示d:盘中所有文件名为file1和file2的列表
for /r d:\ %%h in (file1,file2) do if exist %%h echo %%h

rem 利用for循环计算文本行数
set sumRows=0
for /f "eol=# tokens=1,2,3,4 delims=, " %%i in (userdata.txt) do (
    set /a sumRows+=1
)
echo 有效数据共 %sumRows% 行

rem bat脚本之间的变量是默认共享的,但是这是在被读取的变量所在bat脚本刚刚在本脚本中被call调用过,系统才会记录下此变量值!!!!
rem bat脚本中调用bat,参数就按顺序跟在后面,参数用%1,%2.....去接收
call check_if_200_OK.bat paifile_uploadresult.txt

rem 比较运算符
rem EQU - 等于
rem NEQ - 不等于
rem LSS - 小于
rem LEQ - 小于或等于
rem GTR - 大于
rem GEQ - 大于或等于
if "%status%" NEQ "200_OK" (
    echo paifile: %paiFilePath% upload is faild:
)

rem bat脚本可以像汇编一样用goto进行跳转
goto xxx
:xxx

rem 不等号可以用NEQ也可以用if not
if not "abc" == "def" do (
echo not equal
)

rem 使用%变量名:被替换字符=目的字符%方式进行字符串内字符替换 和 删除!!!如下为删除session_id_tmp变量中的"符号;和把变量var1里面的%%a替换为空
set session_id=%session_id_tmp:"=%
set var1=!str:%%a=!

rem 字符串截取如:从第1个开始取不包含后面3个的所有字符
set str=123456789
echo %str:~0,-3%

rem 字符串合并,直接连着写就行
set aa=伟大的中国!
set bb=我为你自豪!
echo %aa%%bb%

rem 搜索当前目录下所有的文本文件
@echo off
for %%i in (*.txt) do echo "%%i"

rem findstr查找字符串命令,如查找文件vfind_data.txt中包含Hello字符串的行,区分大小写。更多字符串处理的详见https://blog.csdn.net/chuangxin/article/details/104329792
findstr "Hello" vfind_data.txt

::pause命令可以让脚本程序暂停, 会打印输出 “请按任意键继续...”字样。PAUSE>NUL 则表示暂停且不提示“按下任意键继续”。但输出重定向到文件需要程序结束,pause会让文件流不关闭,导致目标文件没有生成
pause

rem 在bat脚本中如果想在'()'的语句块中输出内容,要注意不要使用')',由于bat脚本本身的缺陷,会把括号语句块中的任何后半括弧当作语法符号,这样会报错')'后面的字符串was unexpected at this time.如:
if "%sumRows%" EQU "%numOfSaveSucceed%" (
    echo All data(%sumRows% rows) saved successfully, publish now...

* bat脚本和shell脚本中都可以使用curl语句来进行网络访问,且语法结构相同,但其中变量调用方式会因脚本不同而不同。具体可参考另一篇curl相关文章https://www.cnblogs.com/1118zjg/p/16009792.html


 (如果你觉得有用的话可以关注下博主~欢迎评论区讨论~请注明转载链接~)

posted @ 2022-03-15 18:36  小汀  阅读(1033)  评论(0编辑  收藏  举报