批处理脚本

批处理

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
    • HKCRHKCUHKLM、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值