批处理
1. 常用变量
# 当前工作目录
%cd%
# bat文件所在目录
%~dp0
# 传入bat的第一个参数
%~1
%1
# C:\Users\tudou\AppData\Roaming
%appdata%
# C:\Users\tudou\AppData\Local
%localappdata%
# C:\Users\tudou\Documents
%userprofile%\Documents
# C:\Users\Public\Documents
%PUBLIC%\Documents
# C:\Users\tudou
%userprofile%
# C:\Program Files (x86)
%ProgramFiles(x86)%
# C:\Program Files (x86)\Common Files
%ProgramFiles(x86)%\Common Files
# C:\Program Files
%ProgramW6432%
# C:\Program Files\Common Files
%ProgramW6432%\Common Files
# C:\ProgramData
%ProgramData%
# C:\Users\tudou\AppData\Local\Temp
%temp%
2. code
2.1 if…else
- 等于 ==、equ
- 不等于 neq
- 大于 gtr
- 小于 lss
- 大于等于 geq
- 小于等于 leq
if ERRORLEVEL 1 (echo [ERROR] 请用管理员权限运行!!!) else goto install
) else (
if ERRORLEVEL 1 (
echo [ERROR] 请用管理员权限运行!!!
) else (
goto install
)
2.2 for
for /d %%x in ("pip-*dist-info") do rmdir /s /q "%%x"
rem 创建c1到c10文件夹
for /l %%a in (1,1,10) do (mkdir c%%a)
rem for循环中使用外部变量
setlocal enabledelayedexpansion
set v2=0
:: 正确
FOR /l %%G in (1,1,5) Do (echo [!v2!] & set /a v2+=1)
:: 错误
FOR /l %%G in (1,1,5) Do (echo [%v2%] & set /a v2+=1)
2.3 echo
# 输出内容
echo 123
# 输出空白行
echo.
# 命令执行成功或失败都不显示
task /f /im notepad* >NUL 2>NUL
# ^脱字符,用于输出&|等特殊符号
netstat -aon^|findstr 80
2.4 exist
支持文件或文件夹
# if exist
if exist c:\ (echo y) else (echo n)
# if not exist
if not exist c:\ (echo n) else (echo y)
2.5 set
2.5.1 set
:: 设置或修改变量
set v1=1
2.5.2 set /a
:: 设置或修改变量,右侧为表达式
set /a v1=1*2*3
2.5.3 set /p
:: 输入
set /p sel="select:"
2.5.4 去除路径结尾斜杠
@echo off
set a1=c:\windows\system32\
::set a1=c:\windows\system32\test
set b1=%a1%
if "%a1:~-1%" equ "\" (set b1=%a1:~,-1%)
echo %a1%
echo %b1%
pause
2.6 errorlevel
- 不区分大小写 errorlevel ERRORLEVEL
- 表示上一条命令的返回值
2.6.1 单条语句 %errorlevel%
cmd1
echo %errorlevel%
2.6.2 复合语句 !errorlevel!
- 复合语句时要开启变量延迟,否则errorlevel返回的值跟实际不一致(比如命令返回0,errorlevel值为2)
setlocal enabledelayedexpansion
for /f %%i in (文件列表.txt) do (
%smart_ass% "%%i"
echo !errorlevel!
)
setlocal disabledelayedexpansion
2.6.3 比较
:: errorlevel 大于等于0 跳转sub1
if errorlevel 0 goto :sub1
:: errorlevel 小于0 跳转sub1
if not errorlevel 0 goto :sub1
:: errorlevel 不等于0 跳转sub1
:: EQU - 等于
:: NEQ - 不等于
:: LSS - 小于
:: LEQ - 小于或等于
:: GTR - 大于
:: GEQ - 大于或等于
if %errorlevel% neq 9 goto :sub1
2.7 变量延迟
操作 | 说明 |
---|---|
setlocal enabledelayedexpansion | 开启变量延迟,复合语句一条一条的执行,!变量名!、%变量名%都可以,复合语句中必须使用!变量名!,使用%变量名%值会不变 |
setlocal disabledelayedexpansion | 禁用变量延迟,复合语句按一条语句执行,只能%变量名% |
@echo off
setlocal enabledelayedexpansion
set v1=6
set v2=0
echo %v1%
echo !v1!
echo 第一次for循环
FOR /l %%G in (1,1,5) Do (echo [!v2!] & set /a v2+=1)
echo 第二次for循环
FOR /l %%G in (1,1,5) Do (echo [%v2%] & set /a v2+=1)
pause
2.8 注释
:: 注释1
rem 注释2
2.9 退出
2.9.1 exit
:: 退出cmd
exit
:: 退出当前脚本(比如1.bat调用2.bat,2.bat中执行exit /b)
exit /b
:: 退出当前脚本,并设置返回值为2
exit /b 2
2.9.2 eof
退出当前脚本
:: 退出当前脚本
goto :eof
退出当前标,注意goto调用标签时,goto :eof会直接退出当前脚本
call :sub
:sub
echo aa
goto :eof
2.10 call
2.10.1 call 1.bat
:: 调用1.bat并等待1.bat执行完成
call 1.bat
2.10.2 call 标签
@echo off
set _tst=0
rem 调用标签并传参
FOR /l %%G in (1,1,5) Do (call :sub %%G)
goto :eof
:sub
echo [%1] & set /a _tst+=1
goto :eof
2.11 标签
- call支持执行完返回
- goto不支持执行完返回
@echo off
rem 带参数调用sub2,执行完返回
call :sub2 666
rem 调用sub1,执行完返回
call :sub1
rem 调用sub1,执行完不返回
goto :sub1
rem 该语句不会执行
goto :sub3
:sub1
echo 标签1
goto :eof
:sub2
echo 标签2,参数:%1
goto :eof
:sub3
echo 标签3
goto :eof
3. 以管理员方式运行bat
3.1 自动切换为管理员
方式一
@ECHO OFF & CD /D %~DP0 & TITLE 安装
>NUL 2>&1 REG.exe query "HKU\S-1-5-19" || (
ECHO SET UAC = CreateObject^("Shell.Application"^) > "%TEMP%\Getadmin.vbs"
ECHO UAC.ShellExecute "%~f0", "%1", "", "runas", 1 >> "%TEMP%\Getadmin.vbs"
"%TEMP%\Getadmin.vbs"
DEL /f /q "%TEMP%\Getadmin.vbs" 2>NUL
Exit /b
)
方式二
@ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&EXIT)
3.2 仅判断需要手动切换管理员
@echo off
whoami /groups | find "S-1-16-12288" >nul
if ERRORLEVEL 1 (echo [ERROR] 请用管理员权限运行!!!) else goto install
pause
exit
:install
pause
4. 启动进程
4.1 带参数
# 启动notepad,批处理退出
start "" "notepad.exe" c:\1.txt
4.2 等待进程结束
# 启动notepad,等待notepad结束后,批处理再退出
start /wait /B "" "notepad.exe" c:\1.txt
4.3 结束进程
taskkill /f /im TeamViewer* >NUL 2>NUL
4.4 初始化环境变量,不关闭cmd
类似于VS开发者工具
- 无banner
set msbild_dir=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\
set path=%path%;"%msbild_dir%";
start "mytool" cmd.exe
# 此时可以使用msbuild命令
# 如果此时还是不能使用,可以把%path%放在行最后
- 有banner
set msbild_dir=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\
set path=%path%;"%msbild_dir%";
start "%~dp0logo.bat"
@echo off
title vs2019
echo banner
4.5 管理员运行bat无法同时切换目录
@ECHO OFF & CD /D %~dp0
start cmd.exe
4.6 explorer
# 打开文件夹
explorer C:\Program Files (x86)\Internet Explorer
# 选中文件
explorer /e,/select, C:\Program Files (x86)\Internet Explorer\iexplore.exe
# 选中文件夹
explorer /e,/select, C:\Program Files (x86)\Internet Explorer
5. 文件、文件夹
5.1 删除文件
# 删除文件
del /q "TeamViewer*.txt" >NUL 2>NUL
5.2 删除文件夹
# 删除文件夹
rd/s/q "%tmp%\TeamViewer"2>NUL
5.3 删除文件夹(使用通配符)
# 删除pip-20.3.4.dist-info、pip-19.0.0.dist-info等文件夹
for /d %%x in ("pip-*dist-info") do rmdir /s /q "%%x"
5.4 拷贝文件夹
# 将文件夹LocalAppData\Icecream中的内容拷贝到%LocalAppData%\Icecream\文件夹中
# 第一个参数结尾不能有斜杠
# 第二个参数必须以斜杠结束
xcopy/e/y "LocalAppData\Icecream" "%LocalAppData%\Icecream\"
# 常见问题1:xcopy报错未知错误无法创建目录,原因:第二个参数结尾多了个斜杠
xcopy/e/y "D:\Release" "D:\Update\\"
# 改为
copy/e/y "D:\Release" "D:\Update\"
6. 注册表
- 项、值(值名称+值数据)
- ROOTKEY\SubKey
- HKCR、HKCU、HKLM、HKU、HKCC
- /f 强制操作
- /v 值名称 /ve 默认值名称
- /t 类型
- REG_SZ (不设置/t参数的默认类型)
- REG_MULTI_SZ
- REG_EXPAND_SZ
- REG_DWORD “0x00000022”
- REG_QWORD
- REG_BINARY
- REG_NONE
- /d 数据
6.1 添加
# 添加
Reg Add HKCU\Software\TeamViewer /v UseNewUI /t REG_DWORD /d 1 /F >NUL 2>NUL
6.2 删除
# 删除项
reg delete "HKCU\SOFTWARE\TeamViewer" /f >NUL 2>NUL
7. 服务
7.1 停止服务
sc stop TeamViewer >NUL 2>NUL
sc delete TeamViewer >NUL 2>NUL
10. 创建桌面快捷方式
mshta VBScript:Execute("Set a=CreateObject(""WScript.Shell""):Set b=a.CreateShortcut(a.SpecialFolders(""Desktop"") & ""\TeamViewer.lnk""):b.TargetPath=""%~dp0TeamViewer.exe"":b.WorkingDirectory=""%~dp0"":b.Save:close")
11. 延时退出
# 延时2秒后退出
TIMEOUT /t 2 >NUL&exit
# 延时2秒后退出
ping 127.0.0.1 /n 2 >NUL&exit
12. 查看进程本地和远程端口 tcp udp port
# 忽略大小写搜索包含client的进城
tasklist|findstr /I "client"
# 查找进程使用的端口
netstat -ano|findstr /I "9836"
# 根据pid结束进城
taskkill /f /pid 9836
99. 样例文件
:: 管理员身份运行
@ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&EXIT)
:: xp检测
ver|findstr "5\.[0-9]\.[0-9][0-9]*" > NUL && (
ECHO.&ECHO 当前版本不支持WinXP &PAUSE>NUL&EXIT)
:: 关闭进程
taskkill /f /im XMP.exe >NUL 2>NUL
taskkill /f /im XLLiveUD* >NUL 2>NUL
:: 删除文件和文件夹
:: %temp%
:: %UserProfile%\AppData
:: %AppData%
:: %userprofile%\Documents
:: %PUBLIC%\Documents
:: %ProgramData%
:: %ProgramW6432%\Common Files
:: %ProgramFiles(x86)%\Common Files
rd/s/q "%TEMP%\Xmp"2>NUL
del/q "%ProgramData%\APlayerCodecs3.exe" >NUL 2>NUL
:: 创建文件夹
md "%PUBLIC%\Thunder Network\cid_store.dat" 2>NUL
:: 添加注册表
IF NOT EXIST "%ProgramW6432%" (
reg add "HKLM\SOFTWARE\Thunder Network\ThunderOem\thunder_backwnd" /f /v "dir" /d "%~dp0\" >NUL 2>NUL
) ELSE (
reg add "HKLM\SOFTWARE\Wow6432Node\Thunder Network\ThunderOem\thunder_backwnd" /f /v "Path" /d "%~dp0Program\Thunder.exe" >NUL 2>NUL
)
:: 注册dll
regsvr32 /s BHO\ThunderAgent.dll
::创建桌面快捷方式
mshta VBScript:Execute("Set a=CreateObject(""WScript.Shell""):Set b=a.CreateShortcut(a.SpecialFolders(""Desktop"") & ""\迅雷.lnk""):b.TargetPath=""%~sdp0Program\Thunder.exe"":b.WorkingDirectory=""%~sdp0Program"":b.Save:close")
ECHO.&ECHO 完成 &TIMEOUT /t 2 >NUL&EXIT