老盖教你用BAT脚本“偷”命令的返回值,保证比你家猫还听话!
老盖教你用BAT脚本“偷”命令的返回值,保证比你家猫还听话!
大家好,我是老盖,一个在Windows系统里摸爬滚打多年的老油条。今天跟大家唠唠嗑,聊聊BAT脚本里获取命令返回值那点事儿。
“任性”的%errorlevel%
说起获取命令返回值,估计不少人都用过%errorlevel%。这玩意儿吧,你说它没用吧,也能用,你说它有用吧,有时候真能把你气个半死。怎么说呢?它只能获取上一个命令的返回值,而且有时候返回值还不太靠谱,说变就变!
就拿我当年遇到的一个事儿来说,我写了个脚本,想判断一个程序是不是安装成功。用%errorlevel%判断,结果明明安装失败了,%errorlevel%愣是显示0,搞得我以为安装成功了,差点酿成大祸。所以说,%errorlevel%这玩意儿,有时候比我家的猫还任性,指望它,还不如指望我自己!
所以,今天老盖就教大家一个更靠谱的方法,让你彻底摆脱%errorlevel%的“魔爪”。
为什么要“偷”命令的返回值?
可能有些小伙伴会问了,费这么大劲“偷”命令的返回值干啥?直接看结果不就行了?
这话说的没错,但是有些时候,我们需要根据命令的返回值来做一些判断和处理。比如:
- 判断程序是否安装成功: 就像我上面说的那个例子,如果能准确获取安装程序的返回值,就能避免很多不必要的麻烦。
- 检查网络连接是否正常: 可以用
ping命令测试网络连接,然后根据返回值判断网络是否畅通。 - 验证文件是否存在: 可以用
if exist命令判断文件是否存在,然后根据结果进行后续操作。
举个例子,假如你想写个脚本,自动备份指定目录下的文件。首先要判断目录是否存在,如果不存在,就要先创建目录。这时候,就需要获取md(创建目录)命令的返回值,来判断目录是否创建成功。明白了吧?获取命令返回值,能让你的脚本更加智能、更加灵活。
FOR循环:老盖的“偷天换日”大法
好了,废话不多说,直接上干货。想要准确获取命令的返回值,老盖推荐你用FOR循环。别害怕,FOR循环虽然看起来有点复杂,但是用起来其实很简单。
语法详解
先来简单了解一下FOR循环的语法:
FOR /F "options" %%variable IN ('command') DO (command)
/F:表示要解析命令的输出结果。"options":表示一些选项,比如tokens、delims等,用来控制如何解析输出结果。%%variable:表示一个变量,用来存储命令的输出结果。注意,在BAT脚本里,变量名要用两个百分号%%。'command':表示要执行的命令,用单引号括起来。(command):表示要执行的命令块,用括号括起来。
实战演练
说了这么多,估计你已经有点晕了。没关系,咱们直接上例子,让你一目了然。
假设我们要获取ipconfig命令的输出结果,并将其存储到变量result中,可以这样写:
@echo off
FOR /F "tokens=* delims=" %%a IN ('ipconfig') DO (
SET result=%%a
echo %%a
)
echo %result%
pause
tokens=*:表示获取所有的输出内容。delims=:表示分隔符为空,也就是不使用分隔符。因为我们想要获取完整的输出结果,所以不需要分隔符。%%a:表示一个变量,用来存储每一行的输出结果。SET result=%%a:表示将每一行的输出结果赋值给变量result。注意,这里只会保存最后一行输出结果。echo %%a:表示将每一行的输出结果打印到屏幕上。echo %result%:表示将变量result的值打印到屏幕上。这里只会打印最后一行输出结果。
运行这个脚本,你会发现,屏幕上会显示ipconfig命令的所有输出结果,并且变量result的值是ipconfig命令的最后一行输出结果。
获取多行命令输出
上面的例子只能获取最后一行输出结果,如果想要获取所有行的输出结果,并将其存储到变量中,该怎么办呢?
可以这样写:
@echo off
setlocal enabledelayedexpansion
SET result=
FOR /F "tokens=* delims=" %%a IN ('ipconfig') DO (
SET result=!result!%%a
SET result=!result!
)
echo %result%
pause
setlocal enabledelayedexpansion:表示启用延迟变量扩展。这是因为在FOR循环中,变量的值是在循环开始前确定的,如果在循环中修改变量的值,需要使用延迟变量扩展才能获取到最新的值。SET result=:表示将变量result的值初始化为空。SET result=!result!%%a:表示将每一行的输出结果追加到变量result中。注意,这里要使用!result!而不是%result%,才能获取到最新的值。SET result=!result!:表示在每一行的输出结果后面添加一个换行符,以便区分不同的行。echo %result%:表示将变量result的值打印到屏幕上。这里会打印所有行的输出结果。
运行这个脚本,你会发现,屏幕上会显示ipconfig命令的所有输出结果,并且变量result的值包含了所有行的输出结果,并且每行之间用换行符分隔。
处理空格和特殊字符
有时候,命令的输出结果中会包含空格或者特殊字符,这些字符可能会影响脚本的执行。这时候,就需要对这些字符进行处理。
比如,如果命令的输出结果中包含空格,可以使用引号将命令括起来,或者使用tokens选项指定分隔符。
如果命令的输出结果中包含特殊字符,可以使用转义字符^来转义这些字符。例如,如果要转义>字符,可以写成^>。
“进阶”玩法
除了FOR循环,还有一些其他的技巧可以用来获取命令的返回值。
WMIC
WMIC是一个强大的命令行工具,可以用来获取更详细的系统信息。例如,可以使用WMIC OS GET Caption命令获取操作系统的信息。
@echo off
FOR /F "tokens=2 delims==" %%a IN ('WMIC OS GET Caption /VALUE') DO (
SET os_name=%%a
echo %os_name%
)
pause
PowerShell
PowerShell是一个更强大的脚本语言,可以用来替代一些复杂的BAT脚本操作。例如,可以使用Get-Process命令获取进程的信息,然后使用$?变量获取命令的返回值。
@echo off
powershell -command "Get-Process | Where-Object {$_.ProcessName -eq 'notepad'} ; if ($?) { exit 0 } else { exit 1 }"
echo %errorlevel%
pause
EXIT /B
EXIT /B命令可以用来退出脚本,并且可以指定返回值。例如,可以使用EXIT /B 0命令退出脚本,并且返回值为0。
“踩坑”指南
说了这么多,相信你已经对获取命令返回值有了一定的了解。但是,在实际操作中,你可能会遇到一些“坑”。
- 字符编码问题: 有时候,命令的输出结果的字符编码和脚本的字符编码不一致,会导致乱码。这时候,需要使用
chcp命令修改脚本的字符编码。 - 权限问题: 有时候,脚本没有足够的权限执行某些命令,会导致命令执行失败。这时候,需要以管理员身份运行脚本。
当年老盖我为了解决一个字符编码问题,可是熬了9234分钟!所以,一定要注意这些细节,避免不必要的麻烦。
“老盖”心得
总而言之,想要准确获取命令的返回值,FOR循环是你的不二之选。记住,要灵活运用tokens、delims等选项,并且要注意字符编码和权限问题。
技术这玩意儿,光看是不行的,得自己动手试试,才能真正掌握。所以,赶紧打开你的电脑,写几个脚本试试吧!
记住,我是老盖,一个热爱分享的老油条。希望我的经验能对你有所帮助。 以后遇到问题,欢迎来找我唠嗑!
批处理之家 提供了丰富的BAT脚本学习资源。
CSDN博客 上也有很多关于BAT脚本的教程。
代码先锋网 介绍了BAT脚本中读取命令的返回值。
知乎 上有关于Windows 批处理中for 和 获取指令输出内容的文章。
Windows 批处理脚本指南 介绍了返回值相关知识。