学习bat脚本

Last Updated: 2023-06-04 14:03:18 Sunday

-- TOC --

Windows命令不区分大小写....但参数区分!

内置的命令帮助,使用/?显示。

UEFI Shell的风格,很像Windows Cmd!

> echo a b c
a b c

输出空行:echo.echo:

打开或关闭命名本身的回显功能,是命令本身的那行字符串是否显示出来。在bat脚本文件中,命令前使用@,表示这一行命令本身不回显:

@echo off
echo abcde
@echo on
echo 12345

echo 12345这行命令本身会回显。

rem注释支持命令回显,而::注释不支持。

@echo on
rem abcde
:: 12345

rem abcde这行命令能够在脚本执行过程中看见。

如果不使用call调用另一个bat脚本,那么,执行完那个脚本后,将无法返回当前bat脚本继续后面命令的执行。

使用start的效果,外部命令在新窗口中执行,当前bat继续往下走。如果不使用start,就必须要等待那个命令执行完毕,才能继续下一条命令。

暂停脚本的执行,窗口显示按任意键继续...

set abc=123

如果是从命令行输入给bat脚本的参数,编号从1开始,使用%前缀即可。其它字母类型的变量,前后都要有%%0表示bat文件本身。%*从第1个参数开始的所有参数。

@echo off
set aa=12345
echo %aa%
echo %1
echo %Path%
echo 2

无需多言...

可以用goto实现批量注释:

goto next
# hello world
# this is comment
# this is also comment
:next

#不是必须的,只是为了legible...

> dir > text.txt

直接exit,cmd窗口都会被关闭,此时可以使用exit /b

exit [/b] [exitcode]

含义同bash。

call xxxx.bat && goto succeed || goto failed
:succeed
echo successful
exit /b
:failed
echo failed
pause

类似grep命令。

如果要匹配的字符串是“abc 123”这样形式的,中间有个空格。find命令将会将其视为一个整体来搜索匹配。而findstr命令会将其拆开成abe或123来匹配。

>dir | find "cpp"
2023/05/22  14:50             5,121 image_diff.cpp
2023/05/22  14:50             6,552 testa.cpp

>dir | findstr "cpp h"
2023/05/22  14:50             5,121 image_diff.cpp
2023/05/22  14:50             1,053 image_diff.h
2023/05/22  14:50             6,552 testa.cpp

找到后,errorlevel为0,没找到errorlevel为1。

对应bash中的\

程序执行结束的返回码,exitcode,一般0表示成功。

call xxxx.bat
if %errorlevel% == 0(
    echo successful
) else (
    echo failed
)

cd /d %~dp0

%~dp0表示变量扩展:

cd /d %~dp0
@echo off
devcon find *cldvirtaudiodevice | find "No matching"
if %errorlevel% == 0 (
    devcon.exe install cvadriver.inf "*cldvirtaudiodevice"
)^
else (
    echo #### Virtual audio device already exists. ####
)
@echo on

本文链接:https://cs.pynote.net/sf/win/202305291/

-- EOF --

-- MORE --