运维必学 | 条件语句-从零开始学Windows批处理(Batch)编程系列教程

2023-10-31 17:18:32 浏览数 (1)

本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [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,不成功则返回非零。

示例演示:

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

执行结果:

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

扩展示例:

代码语言:javascript复制
@echo off
:: 利用返回错误代码选择执行命令演示
cls

:: 示例1
@whoamis
if %ERRORLEVEL%==0 (
echo Program had return code 0
) else (
echo Program had return code %ERRORLEVEL%,This Program Not True Execute!!
)

:: 示例2
whoami
if %ERRORLEVEL%==0 (echo Program had return code 0) else echo Program had return code %ERRORLEVEL%,This Program Not True Execute!!

执行结果:

代码语言:javascript复制
'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!!

weiyigeekweiyigeek
Program had return code 0

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

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

语法示例:

代码语言:javascript复制
IF [NOT] ERRORLEVEL number command1 ELSE command2
IF [NOT] string1==string2 command ELSE command2
IF [NOT] EXIST filename command ELSE command2

参数说明:

代码语言:javascript复制
NOT               # 指定只有条件为 false 的情况下,Windows 才应该执行该命令
ERRORLEVEL number # 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true
string1==string2  # 如果指定的文字字符串匹配,指定条件为 true
EXIST filename    # 如果指定的文件名存在,指定条件为 true

command           # 如果符合条件则执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令

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

代码语言:javascript复制
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 关键字表示的逻辑关系,例如在进行字符对比时则表示当字符串不同时则条件成立运行指定命令,否则运行另外一个命令。

示例演示:

代码语言:javascript复制
:: # 使用 %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

正确的做法:

代码语言:javascript复制

执行结果:


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

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


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

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

示例演示:

代码语言:javascript复制
@echo off
:: IF 语句测试
echo 当前执行文件:%~fs0
IF 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命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。

语法示例

代码语言:javascript复制
# 语法
if errorlevel <数字> 待执行的命令

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

示例演示

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

代码语言:javascript复制
@echo off
cls
whoami

:: 当 %ERRORLEVEL%  大于 1 时执行 bn1 子函数,否则执行an1子函数
IF %ERRORLEVEL% GTR 1 goto bn1 else goto an1

:an1
echo Program had return code 1
pause>nul
exit

:bn1
echo Program had return code %ERRORLEVEL%

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

代码语言:javascript复制
@echo off
XCOPY C:AUTOEXECa.BAT D:
echo %ERRORLEVEL%
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误aa
goto end
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
goto end
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作
goto end
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
goto end
IF ERRORLEVEL 0 ECHO 成功拷贝文件
:end
pause

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

代码语言:javascript复制
# 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。

示例演示

代码语言:javascript复制
@echo off
:: # 判断变量是不是存在
:: 当变量存在时
SET AA="计算器"
ECHO �%
IF DEFINED AA (echo "打开计算器" & calc) ELSE ECHO "AA 变量值 非 计算器"

:: 当变量不存在时
ECHO �%
IF DEFINED AB (echo "AB 变量存在") ELSE ECHO "AB 变量,貌似不存在"

执行结果:

代码语言:javascript复制
"打开计算器"
"AB 变量,貌似不存在"

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

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

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

代码语言:javascript复制
:: # CMD 终端展示
echo "验证命令扩展是否启用:" %CMDEXTVERSION%

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

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

执行结果:

示例演示

代码语言:javascript复制
@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

0 人点赞