Windows批处理进阶使用教程
Windows批处理是真的难用,可以感受到这个脚本解释器非常烂,写吐了。
@echo off
用来关闭后续所有命令的回显.
@ 符号:禁止当前行自身的回显(即避免 echo off 这一行也被显示)
@echo off
echo Hello World
pause
运行上述脚本时,会看到:
Hello World
Press any key to continue...
@echo on
:开启回显,需要debug的时候,可以把off改成on,看看具体是哪一行出问题。
设置字符编码为 UTF-8
chcp 65001 >nul
chcp 是改变控制台的代码页的命令,65001是 UTF-8 编码的代码页。
这行命令将命令提示符窗口的字符编码设置为UTF-8,以确保支持中文或其他多字节字符。如果不加这行,默认的编码基本上就是ASCII编码码。
nul 是为了将 chcp 命令的输出隐藏,不显示在控制台。
延迟变量扩展(重点)
setlocal enabledelayedexpansion
变量的值通常会在命令执行时被解析。如果启用延迟扩展,变量会在命令执行时动态解析。这对于在循环或条件语句中使用变量时特别有用。
这个要配合 !变量!,一起使用,原本是%变量%
如果没有加 !,批处理在运行时,会把%变量%当作是硬编码直接执行。
举例:
@echo off
setlocal enabledelayedexpansion
set /p var=请选择:
if %var% EQU 1 (echo "123"
)
这样会直接跳过,因为用的是%var%
正确写法是让变量会在命令执行时动态解析:
@echo off
setlocal enabledelayedexpansion
set /p var=请选择:
if !var! EQU 1 (echo "123"
)
设置控制台颜色
color 0F
color 0F 设置命令提示符窗口的文本颜色和背景颜色。
0 是黑色背景。
F 是白色文本。
注释
批处理中的注释就是坏家伙,即使是注释,批处理也会解析这一行,在循环中使用会影响性能。
常见注释方式:
1、 REM - 标准注释
2、 :: - 双冒号注释(实际是无效标签),代码块中不能用双冒号,双冒号只能在代码块外使用
坑:
1、注释中的特殊字符:
REM 这个注释包含 > 重定向符号会出问题
REM 使用 &、 |、 : 、:(中文的:)符号也会被解析
REM 使用 ^> 转义后也不一定会安全
有个我不理解的,就是为什么使用 :也会被解析成变量,使用 ^ 转义也没有用。
日志
:LogInfo
REM Function - Output info level log (white)
cls
echo [信息] %~1
goto :eof:LogSuccess
REM Function - Output success level log (green)
cls
powershell -c "Write-Host '[成功] %~1' -ForegroundColor Green"
goto :eof:LogWarning
REM Function - Output warning level log (yellow)
cls
powershell -c "Write-Host '[警告] %~1' -ForegroundColor Yellow"
goto :eof:LogError
REM Function - Output error level log (red)
cls
powershell -c "Write-Host '[错误] %~1' -ForegroundColor Red"
goto :eof
使用方法:
call :LogInfo "%LANG_DETECTED%: !SELECTED_LANG_DISPLAY!"
调用其他脚本
问题现象
通过批处理调用 VBS 或 PowerShell 后台执行其他软件时,软件运行几秒就自动退出,但手动启动正常。
这个问题我还没有解决,也不理解为什么,于是我当作是bash的BUG把程序搞挂了。
我能想到的方式全部都试过了,结局是都是运行几秒后就退出,或者是程序控制台弹窗没有隐藏。
如果有大佬可以做到,隐藏程序的控制台弹窗(不是在编译选项禁用程序的控制台),并且可以用bat启动,在bat关闭后程序能够正常运行,请指导我。
曲线救国
echo Set WshShell = CreateObject^(^"WScript.Shell^"^) > "temp.vbs"
echo WshShell.Run ^"temp.exe^", 0, False >> "temp.vbs"
最后由用户,自己手动执行 temp.vbs来启动程序,