batch语法

ads
欢迎关注「全栈工程师修炼指南」公众号
专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享
设为星标⭐每天带你 基础入门 到 进阶实践 再到 放弃学习
作者主页:[ https://www.weiyigeek.top ]  

博客:[ https://blog.weiyigeek.top ]

作者<安全开发运维>答疑交流群,回复【学习交流群】即可加入

请看友们【点击文中的广告】,以支持作者更新更多文章

文章目录:

本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。


0x00 批处理(Batch)命令返回值

描述: 在 Windows 批处理脚本中,类似于 Shell 其也是支持 if...eles 条件判断, 不过在介绍语句前我们先来看看其命令行执行返回值,你可以将其认为返回错误参数相当于Linux中的$?变量。

温馨提示: Windows Batch 批处理系列教程示例脚本可访问作者Github仓库中DevelopLearnig的项目,✈直达-> https://github.com/WeiyiGeek/DevelopLearnig/tree/main/TerminalScript/bat

在批处理中有些命令在执行之后将会返回一定的错误值errorlevel,可以通过%errorlevel%变量值判断命令执行的状况,说到此处又类似于C语言中的exit(err_num)方法,其中err_num就是错误代码。

获取返回值errorlevel的方法就是,在执行命令后立马调用%errorlevel%变量,若是执行成功则返回0,不成功则返回非零。

示例演示:

@echo off:: CMD终端执行echo "WeiyiGeek 一个想成为全栈的男人。"echo 返回值:%ERRORLEVEL%:: #---------------------------------------------#whoami /noparamaecho 错误返回值:%ERRORLEVEL%:: #---------------------------------------------#whoami :: 注意执行的命令片段需要使用()包裹if %errorlevel%==0 (echo "执行成功") else (echo "执行失败")"执行成功"

执行结果:

温馨提示: 在逻辑运算符中||与 &&也是根据errorlevel的值来进行逻辑判断的。

扩展示例:

@echo off:: 利用返回错误代码选择执行命令演示cls
:: 示例1@whoamisif %ERRORLEVEL%==0 (echo Program had return code 0) else (echo Program had return code %ERRORLEVEL%,This Program Not True Execute!!)
:: 示例2whoamiif %ERRORLEVEL%==0 (echo Program had return code 0) else echo Program had return code %ERRORLEVEL%,This Program Not True Execute!!

执行结果:

'whoamis' is not recognized as an internal or external command,operable program or batch file.Program had return code 9009,This Program Not True Execute!!
weiyigeekweiyigeekProgram had return code 0

0x01 批处理(Batch)条件判断

描述: 批处理中主要使用 if 语句命令执行批处理程序中的条件处理。

语法示例:

IF [NOT] ERRORLEVEL number command1 ELSE command2IF [NOT] string1==string2 command ELSE command2IF [NOT] EXIST filename command ELSE command2

参数说明:

NOT               # 指定只有条件为 false 的情况下,Windows 才应该执行该命令ERRORLEVEL number # 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 truestring1==string2  # 如果指定的文字字符串匹配,指定条件为 trueEXIST filename    # 如果指定的文件名存在,指定条件为 true
command # 如果符合条件则执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令

若命令扩展 (Extend) 被启用,IF 语句会有如下改变:

IF [/I] str1 compare-op str2 command #  指定 /I 开关要进行的字符串比较不分大小写, 其中 compare-op 可以是  # EQU - 等于         equal  # NEQ - 不等于       not equal  # LSS - 小于         less than  # LEQ - 小于或等于   less than or equal  # GTR - 大于         grater  than   # GEQ - 大于或等于    grater than otr equal
IF CMDEXTVERSION number command# CMDEXTVERSION : 其与 ERRORLEVEL 类似也是一个环境变量,但是其用于指定或者展示要使用的扩展命令处理程序的版本。 # 值若为1(默认),表示使用Windows XP或更早版本的命令处理程序。 # 值若为2,表示使用Windows Vista或更高版本的命令处理程序,其中包含更多的命令扩展功能。
IF DEFINED variable command# DEFINED 作用与EXIST类似,其主要用于验证环境变量是否存存在。

温馨提示: /I 可用于IF的string1==string2的表达式。

1.IF 条件 (命令) ELSE (命令)

描述: 我们在批处理脚本使用IF...ELSE...条件判断语句,可以帮助我们好的处理业务流程,但是在实际使用中请注意其语法格式,在批处理脚本中此关键字需要写在同一行上。

如果在IF表达式中使用 NOT 关键字表示的逻辑关系,例如在进行字符对比时则表示当字符串不同时则条件成立运行指定命令,否则运行另外一个命令。

示例演示:

:: # 使用 %errorlevel% 变量判断命令是否成功执行。if %errorlevel%==0 (echo "执行成功") else (echo "执行失败")
:: # 使用 if [not] "参数" == "字符串"(命令)进行判断SET Author="WeiyiGeek":: # 不使用 NOT 关键字时IF %Author%=="WeiyiGeek" (echo "A = WeiyiGeek") ELSE echo "A != WeiyiGeek":: # 使用 NOT 关键字时IF NOT %Author%=="WeiyiGeek" (echo "Author is not WeiyiGeek") ELSE echo "Author is WeiyiGeek"

Q: 如果不写在同一行上会怎么样呢? 下面我们来看一个例子:

由于 del 命令需要用新的一行终止,因此在CMD中以下子句不会有效:
IF EXIST filename. del filename. ELSE echo filename. missing
但是由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也不会有效:
IF EXIST filename. del filename.
ELSE echo filename. missing

正确的做法:


执行结果:


偷偷的告诉你哟?极客全栈修炼】微信小程序已开放

可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。




2.IF [NOT] EXIST 文件 (命令) ELSE (命令)

描述: 前面我们简单的演示了一下EXIST关键字的使用,此处我们再来看看去综合利用示例,在 IF - ELSE 连用是还需注意一点,ELSE 子句必须出现在同一行上的 IF 之后。

示例演示:

@echo off:: IF 语句测试echo 当前执行文件:%~fs0IF EXIST test.js (  echo delete filename:: # 直接删除文件无需键盘输入  echo y|del test.js) ELSE (  echo filename. missing.)
:: # 采用通配符得方式IF EXIST *.html ( echo delete *.html echo y|del *.html) ELSE ( echo filename. missing.)
:: 建议关键字大写,表示如果存在c:config.sys文件,则显示它的内容。if NOT EXIST c:config.sys (echo c:config.sys) ELSE type c:config.sys
:: 判断文件是不是存在,如果不存在就建立IF NOT EXIST Republic.txt (echo "Republic" > Republic.txt & echo "Create Successful") ELSE (ECHO "Repubic.txt is Exsit")

执行结果:


3.IF [NOT] ERRORLEVEL number (命令) ELSE (命令)

描述: 很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。

如果返回值等于指定的数字,则条件成立运行命令,否则运行下一句。

温馨提示: IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。

语法示例

# 语法
if errorlevel <数字> 待执行的命令

# 简单示例
if errorlevel 2 goto x2
if errorlevel EQU 2 goto x2

示例演示

1.使用比较符号进行数值的比较,从而指定要跳转的子函数。

@echo offclswhoami
:: 当 %ERRORLEVEL% 大于 1 时执行 bn1 子函数,否则执行an1子函数IF %ERRORLEVEL% GTR 1 goto bn1 else goto an1
:an1echo Program had return code 1pause>nulexit
:bn1echo Program had return code %ERRORLEVEL%

2.使用返回值来判断复制任务是否执行成果,此处使用XCOPY命令演示ErrorLevel等级,如果文件拷贝成功屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。

@echo offXCOPY C:AUTOEXECa.BAT D:echo %ERRORLEVEL%IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误aagoto endIF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作goto endIF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作goto endIF ERRORLEVEL 1 ECHO 未找到拷贝文件goto endIF ERRORLEVEL 0 ECHO 成功拷贝文件:endpause

扩展补充:
1.由于有的DOS命令自身也会返回指定的ERRORLEVEL登录,除了上述的XCOPY 命令,除此之外还有diskcomp 命令、diskcopy 命令、format 命令, 以下就是这几个常用命令的返回值及其代表的意义。

# xcopy 命令0 成功拷贝文件1 未找到拷贝文件2 用户通过ctrl-c中止拷贝操作4 预置错误阻止文件拷贝操作5 拷贝过程中写盘错误
# diskcomp 命令0 盘比较相同1 盘比较不同2 用户通过ctrl-c中止比较操作3 由于致命的错误使比较操作中止4 预置错误中止比较
# diskcopy 命令0 盘拷贝操作成功1 非致命盘读/写错2 用户通过ctrl-c结束拷贝操作3 因致命的处理错误使盘拷贝中止4 预置错误阻止拷贝操作
# format 命令0 格式化成功1 格式化失败2 格式化~~~3 用户通过ctrl-c中止格式化处理4 因致命的处理错误使格式化中止5 在提示“proceed with format(y/n)?”下用户键入n结束

3.IF [NOT] DEFINED variable (命令) ELSE (命令)

描述: 如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样,除了它取得一个环境变量,返回的结果是 true。

示例演示

@echo off:: # 判断变量是不是存在:: 当变量存在时SET AA="计算器"ECHO %AA%IF DEFINED AA (echo "打开计算器" & calc) ELSE ECHO "AA 变量值 非 计算器"
:: 当变量不存在时ECHO %AB%IF DEFINED AB (echo "AB 变量存在") ELSE ECHO "AB 变量,貌似不存在"

执行结果:

"打开计算器"
"AB 变量,貌似不存在"


亲,文章就要看完了,不关注一下【全栈工程师修炼指南】吗?



3.IF [NOT] CMDEXTVERSION variable (命令) ELSE (命令)

描述: 通常在DOS(CMD.EXE)启动后,其运行环境中已经内置很多预定义变量 CMDEXTVERSION 就是其中一个,我们如果想获取当前CMD.EXE的命令扩展版本号,即可以通过%CMDEXTVERSION%环境变量获取。

如果当前 CMD.EXE 启用了命令扩展,则CMDEXTVERSION会被预定义
如果当前 CMD.EXE 禁用命令扩展,则CMDEXTVERSION不会被预定义


:: # CMD 终端展示
echo "验证命令扩展是否启用:" %CMDEXTVERSION%

:: 禁用命令扩展 (会新启动一个子shell终端)
cmd /e:off

echo "再次验证命令扩展是否启用:" %CMDEXTVERSION%

执行结果:

示例演示

@echo off
:: # 启用命令扩展
setlocal enableExtensions

:: # 当前脚本执行环境是否支持扩展以及输出 CMDEXTVERSION 值
echo "命令扩展是否启用:" %CMDEXTVERSION%

:: # 查看用户是否定义了CMDEXTVERSION环境变量
set | findstr "CMDEXTVERSION">nul
if ERRORLEVEL 1 (
:: # 如果%CMDEXTVERSION%非空,则当前CMD.EXE开启了命令扩展,否则禁用
if ""=="%CMDEXTVERSION%" ( echo 命令扩展被禁用) else ( echo 命令扩展被开启)
REM # 检查当前命令解释器的版本
if "%CMDEXTVERSION%"=="2" (
echo 当前命令解释器版本为 2
REM 在这里执行与版本 2 相关的操作
) else (
echo 当前命令解释器版本不是 2
REM 在这里执行与其他版本相关的操作
)

IF CMDEXTVERSION 0 (echo "True -> %CMDEXTVERSION%") ELSE (echo "False -> %CMDEXTVERSION%") # "True -> 2"
IF CMDEXTVERSION 1 (echo "True -> %CMDEXTVERSION%") ELSE (echo "False -> %CMDEXTVERSION%") # "True -> 2"
IF CMDEXTVERSION 2 (echo "True -> %CMDEXTVERSION%") ELSE (echo "False -> %CMDEXTVERSION%") # "True -> 2"
IF CMDEXTVERSION 3 (echo "True -> %CMDEXTVERSION%") ELSE (echo "False -> %CMDEXTVERSION%") # "False -> 2"
IF CMDEXTVERSION 4 (echo "True -> %CMDEXTVERSION%") ELSE (echo "False -> %CMDEXTVERSION%") # "False -> 2"

:: # 禁用命令扩展
setlocal disableExtensions
echo %CMDEXTVERSION%


本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/2023/6-29-758.html


如果此篇文章对你有帮助,请你将它分享给更多的人! 

 学习书籍推荐 往期发布文章 

回复【0014】获取【Nginx学习之路汇总】
回复【0015】获取【Jenkins学习之路汇总】
回复【10005】获取【adb工具刷抖音赚米】
回复【0011】获取【k8S二进制安装部署教程】
回复【10001】获取【WinServer安全加固脚本】
回复【0008】获取【Ubuntu22.04安装与加固脚本】
回复【10002】获取【KylinOS银河麒麟安全加固脚本】


 热文推荐  


  • 运维必学 | 初识介绍-从零开始学Windows批处理(Batch)编程系列教程

  • 运维必学 | 运算符优先级-从零开始学Windows批处理(Batch)编程系列教程

  • 运维必学 | 变量定义调用-从零开始学Windows批处理(Batch)编程系列教程

  • 完整的Windows与Linux服务器系统安全加固实践和基线检测脚本(等保2.0)

  • 【脚本分享】- Windows下利用Powershell进行MySQL数据库备份

欢迎长按(扫描)二维码 取更多渠道哟!

欢迎关注 【全栈工程师修炼指南】(^U^)ノ~YO

添加作者微信weiyigeeker】,拉你一起学习交流吧!

关注回复【学习交流群】即可加入【安全开发运维沟通交流

温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,若有问题或建议请在文章末尾留下您宝贵的经验知识,或联系邮箱地址 master@weiyigeek.top 或  [全栈工程师修炼指南] 留言。






点击"阅读原文"获取更多有趣的知识

若有帮助请点个赞 + 在看

最后编辑于:2024/1/21 拔丝英语网

admin-avatar

英语作文代写、国外视频下载

高质量学习资料分享

admin@buzzrecipe.com