概述
.bat(Batch)与.cmd文件基本等价,通过调用cmd.exe(命令解释器)来执行命令,是一种简化的脚本语言
将其放在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp即可实现开机自启,(一开机就把对方关机)
与其他编程语言不同的是.bat更加方便调用操作系统
bat语言请不要乱加空格和缩进
所有语法可以通过指令/?
的形式直接在cmd中查看,如for/?
下面只是选取了常用的语法
语法
命令大小写不敏感
物质
变量全是字符串,通过set来声明和定义
可以通过/a进行数值运算,通过/p进行输入
通过%var%或!var!来进行访问,后者在延迟模式下访问,即在运行时变量需要改变
set
set
查看所有环境变量
setx test "Hello World"
创建/修改环境变量
set | findstr "Path"
查看指定环境变量
set /a num=%var1%+%var2%
将字符串进行算数运算 a: algorithmn
set /p path=please enter the file path:
即时输入prompt赋值
貌似desktop添加到path会不会生效,如果自定义的程序就专门弄个文件夹吧
string
(替换)延迟,截取,查找
@echo off
rem 使用Unicode编码,中文显示
chcp 65001
set str=Hello World
rem 替换文本 延迟变量
@echo off&setlocal enabledelayedexpansion
set str=!str:World=BAT!
echo !str!
endlocal
rem 截取 (截取位置,截取长度) -代表从最后开始
set str1=%str:~-5%
set str2=%str:~0,5%
echo %str1%
echo %str2%
rem 查找,支持正则表达式
findstr /c:"geek" result.txt || echo 查找失败
echo %str% | findstr /c:"Hello" && echo 查找成功 || echo 查找失败
for /f "tokens=2 delims==" %i in ('findstr "PACKAGE=" config.ini') do set PACKAGE=%i
pause
echo
@echo off
不显示命令行本身
echo hello world
打印字符串
运动
控制语句
if/? 学会查看语法
if
判断dos命令的返回值IF [NOT] ERRORLEVEL number command
ping www.baidu.com -n 1 -w 10
IF ERRORLEVEL 0 (@echo baidu is available)
ELSE (@echo baidu is unavailable)
判断逻辑关系 IF [NOT] string1==string2 command
set a=0
IF NOT %a% ==0 (@echo success)
if %a% ==0 (@echo fail)
if 1 NEQ 2 echo unequal
rem < : LSS || <= : LEQ || > : GTR || >= : GEQ || == : EQU || != : NEQ
for
数字遍历
FOR /L %variable IN (start,step,end) DO command [command-parameters]
rem 输出当前目录每一个文件名
for %%i in (*.*) do echo "%%i"
rem 输出1~10,间隔2
FOR /L %%i in (1,2,10) DO (echo %%i)
字符遍历
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
FOR /F %%i in ("abcde") DO (echo %%i )
pause
options
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。如表头
delims=xxx - 指分隔符集。这个替换了空格和制表符的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。
将host中的ip地址以.分隔的第四段打印出来,这个挺常用的
for /F "delims=. tokens=4" %%i in (hosts.txt) DO (echo %%i ) //文件
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr mCurrent') do set activity=%%a //命令的输出
for /f "delims=}" %%a in ("mCurrentFocus=Window{5d7f9b3 u0 com.supercell.clashofclans/com.supercell.titan.GameApp} ") do set activity=%%a //直接字符串
goto
:label
goto label
延时
rem 暂停1s,利用选择来实现;
rem /t 1 等待1s; /d y默认选择yes; >nul不显示结果
choice /t 1 /d y >nul
重定向
>> > <
输入,输出
echo hello>con
输出到控制台(默认)
>nul
不显示命令执行结果
echo 127.0.0.1 example.com>> %windir%\system32\drivers\etc\hosts
添加到文件末尾
组合
& 表示将多条命令连接在一起,前一条命令的状态不影响后一条命令的执行。
| 表示将多条命令连接在一起,并将前一条命令的输出作为后一条命令的输入。
&& 表示前一条命令成功时,才执行后一条命令。
|| 表示前一条命令失败时,才执行后一条命令。
其他
cls 清屏 pause暂停 ren 重命名 tree 指定目录的树状结构
type 显示文件内容
copy c:test.txt d:test.bak
title newtitle 设置cmd窗口的标题
del
系统
文件夹
dir 显示文件夹内容
cd切换目录 change dir
md创建目录 make
rd删除目录 remove
start 启动程序(放在user/username/
目录下可直接快捷启动
隐藏cmd窗口
利用vbs实现
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "d:\yourscript.bat",0
可以转化成bat,将下面加入代码开头
这里为脚本的第一个参数(%1)设置标签h防止脚本重复运行
@echo off 可以实现同样的效果,就是要闪一下
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
windows小技巧
文件已被程序使用
ctrl+shift+esc打开任务管理器
打开性能->资源监视器->cpu页->搜索相关的句柄
使用
图片批量重命名
@echo off
setlocal enabledelayedexpansion
:loop
set /p path=please enter the path:
if not exist %path% (
echo Error: The folder does not exist.
goto loop
)
cd %path%
set i=0
for %%a in (*) do (
set /a i+=1
set num=0000!i!
set num=!num:~-4!
ren "%%a" "!num!.jpg"
)
echo done
pause
endlocal
扫盘
dir D:\*.exe /s>>.\result.txt
修改host文件
@echo off
net session >nul 2>&1 || echo please enter with administer
echo 127.0.0.1 www.bilibili.com >> %windir%\system32\drivers\etc\hosts
pause
循环等待输入
:input_loop
echo Input a value:
set /p input=
if "%input%" == "exit" goto exit_loop
echo You entered: %input%
goto input_loop
:exit_loop
echo Exiting loop.
修改环境变量
@echo off
REM Check if the script is run as administrator
net session >nul 2>&1
if %errorlevel% == 0 (
echo Running as administrator
goto choose
) else (
echo This script requires administrator privileges. Exiting...
goto exit
)
:choose
echo Please choose the mode:
echo 1. Add
echo 2. Remove
set /p choose=Enter your choice (1 or 2):
if %choose% == 1 (
set /p exePath="Enter the path to the exe file: "
setx PATH "%PATH%;%exePath%"
) else if %choose% == 2 (
set /p dirPath="Enter the path to the directory to be removed (enclosed in quotes if the path contains spaces): "
set PATH=%PATH:%dirPath%=%
setx PATH "%PATH%"
) else (
echo Please enter a valid choice.
goto choose
)
:exit
pause
恢复win10右键菜单
执行后需要重新启动才能生效
#修改为win10
reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
#还原为win11
reg delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
关闭自动更新
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d "1" /f
关闭WD开机自启
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "Windows Defender" /d "C:\Program Files\Windows Defender\MSASCui.exe" /f
关闭安装前提示
win+r control打开控制面板
用户账户->更改用户账户控制设置
将通知频率设为从不通知
windows修复系统
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow