Windows批处理脚本(.bat/.cmd)编写终极指南

admin 2026-03-10 02:43:59 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 这篇文章是Windows批处理脚本编写的全面教程,涵盖基础语法、变量参数、流程控制、文件操作、网络系统命令、错误处理等核心内容。文章提供大量可执行代码示例,包括菜单系统、批量文件处理、系统维护脚本等实用模板,适合运维人员学习参考。 综合评分: 78 文章分类: 终端安全,安全工具



五、网络与系统命令

5.1 网络相关命令

@echo off
:: IP配置
ipconfig /all
ipconfig /release
ipconfig /renew
ipconfig /flushdns

:: 连通性测试
ping -n 4 www.baidu.com
tracert www.google.com

:: 网络连接
netstat -ano
netstat -an | findstr ":80"

:: DNS查询
nslookup www.microsoft.com

:: 网络共享
net share
net use Z: \\server\share

:: WiFi管理
netsh wlan showprofiles
netsh wlan connectname="MyWiFi"

5.2 系统管理命令

@echo off
:: 用户管理
net user
net user username password /add
net localgroup administrators username /add

:: 服务管理
net start
net stop"ServiceName"
sc query"ServiceName"

:: 系统信息
systeminfo
wmic os get Caption,Version
wmic cpu getName,NumberOfCores
wmic memorychip getCapacity

:: 任务管理
tasklist
taskkill /pid 1234 /f
taskkill /im notepad.exe /f

:: 注册表操作
reg query"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion"
reg add"HKCU\Software\MyApp" /v "Setting" /t REG_SZ /d "Value"

5.3 计划任务

@echo off
:: 创建计划任务
schtasks /create /tn"MyTask" /tr"C:\myscript.bat" /sc daily /st09:00

:: 查看计划任务
schtasks /query

:: 删除计划任务
schtasks /delete /tn"MyTask" /f

:: 运行计划任务
schtasks /run /tn "MyTask"

5.4 系统维护脚本

@echo off
title 系统维护工具
color 0a

echo 清理临时文件...
del /q /f /s "%temp%\*.*"
del /q /f /s "%systemroot%\temp\*.*"

echo 清理回收站...
rd /s /q %systemdrive%\$Recycle.bin

echo 清理Windows更新缓存...
net stop wuauserv
del /q /f /s "%systemroot%\SoftwareDistribution\Download\*.*"
net start wuauserv

echo 优化磁盘...
defrag C: /H /U /V

echo 系统维护完成!
pause

六、错误处理与调试

6.1 错误级别处理

@echo off
:: 检查错误级别
some_command
if errorlevel 1 (
    echo 命令执行失败,错误级别:%errorlevel%
    goto error_handler
)

:: 设置自定义错误级别
set ERRORLEVEL=0
if some_condition (
    set ERRORLEVEL=1
    exit /b1
)

:error_handler
echo 发生错误,正在处理...
pause
exit /b %ERRORLEVEL%

6.2 异常处理

@echo off
:: 使用临时文件检测错误
set tempfile=%temp%\error.tmp
del "%tempfile%"2>nul

some_command >nul 2>"%tempfile%"
if exist "%tempfile%" (
    echo 命令执行出错
    type"%tempfile%"
    del "%tempfile%"
    gotocleanup
)

:cleanup
:: 清理工作

6.3 调试技巧

@echo off
:: 启用详细输出进行调试
set DEBUG=1

if defined DEBUG echo [DEBUG] 开始执行脚本

:: 在关键位置添加调试信息
if defined DEBUG echo [DEBUG] 变量值:name=%name%

:: 使用日志文件
set LOGFILE=debug.log
echo [%date% %time%] 脚本开始 >> "%LOGFILE%"

:: 条件暂停
if defined DEBUG pause

6.4 日志记录

@echo off
setLOGFILE=%~n0_%date:~0,4%%date:~5,2%%date:~8,2%.log

:log
echo [%date% %time%] %* >> "%LOGFILE%"
if defined DEBUG echo [%date% %time%] %*
goto :eof

call :log 脚本开始执行
call :log 执行用户:%username%
call :log 计算机名:%computername%

:: 主要逻辑
call :log 主要操作完成

call :log 脚本执行结束

七、高级技巧

7.1 函数调用

@echo off
call :myfunction "Hello""World"
call :calculate 105
goto :eof

:myfunction
echo 函数参数1:%~1
echo 函数参数2:%~2
goto :eof

:calculate
set /a sum=%1 + %2
set /a diff=%1 - %2
echo %1 + %2 = %sum%
echo %1 - %2 = %diff%
goto :eof

7.2 数组模拟

@echo off
setlocal enabledelayedexpansion

:: 创建数组
set arr[0]=apple
set arr[1]=banana
set arr[2]=cherry
set arr_length=3

:: 遍历数组
for /l %%i in (0,1,%arr_length%) do (
    if defined arr[%%i] (
        echo 元素 %%i: !arr[%%i]!
    )
)

:: 动态数组
setcount=0
for %%f in (*.txt) do (
    set arr[!count!]=%%f
    set /a count+=1
)

7.3 字符串操作

@echo off
set"text=Hello World"

:: 字符串长度
call :strlen result "%text%"
echo 字符串长度:%result%

:: 子字符串
echo 前5个字符:%text:~0,5%
echo 后5个字符:%text:~-5%
echo 从第6个开始:%text:~6%

:: 字符串替换
set"newtext=%text:Hello=Hi%"
echo 替换后:%newtext%

:: 去除前后空格
set"spaced=   Hello   "
call :trim trimmed "%spaced%"
echo 去除空格后:%trimmed%

goto :eof

:strlen<result_var><string>
setlocal&nbsp;enabledelayedexpansion
set"str=%~2"
set"len=0"
:strlen_loop
if"!str!"==""goto&nbsp;strlen_done
set"str=!str:~1!"
set&nbsp;/alen+=1
goto&nbsp;strlen_loop
:strlen_done
endlocal &&nbsp;set"%~1=%len%"
goto&nbsp;:eof

:trim&nbsp;<result_var><string>
setlocal&nbsp;enabledelayedexpansion
set"str=%~2"
:trim_begin
if"!str:~0,1!"==" "set"str=!str:~1!"&nbsp;&&nbsp;goto&nbsp;trim_begin
:trim_end
if"!str:~-1!"==" "set"str=!str:~0,-1!"&nbsp;&&nbsp;goto&nbsp;trim_end
endlocal &&nbsp;set"%~1=%str%"
goto&nbsp;:eof

7.4 权限提升

@echo&nbsp;off
:: 检查是否以管理员身份运行
net session >nul 2>&1
if&nbsp;%errorlevel% neq 0 (
&nbsp; &nbsp;&nbsp;echo&nbsp;需要管理员权限
&nbsp; &nbsp; powershell -Command&nbsp;"Start-Process '%~f0' -Verb RunAs"
&nbsp; &nbsp;&nbsp;exit&nbsp;/b
)

echo&nbsp;已获得管理员权限
:: 执行需要管理员权限的操作

八、实用脚本模板

8.1 备份脚本模板

@echo off
title 自动备份脚本
setlocal enabledelayedexpansion

:: 配置
set&nbsp;SOURCE_DIR=C:\ImportantData
set&nbsp;BACKUP_DIR=D:\Backup
setDATE=%date:~0,4%%date:~5,2%%date:~8,2%
set&nbsp;BACKUP_NAME=backup_%DATE%

:: 创建备份目录
ifnot&nbsp;exist&nbsp;"%BACKUP_DIR%"&nbsp;mkdir&nbsp;"%BACKUP_DIR%"

:: 执行备份
echo 开始备份...
xcopy&nbsp;"%SOURCE_DIR%""%BACKUP_DIR%\%BACKUP_NAME%\" /e /h /y /c /r

:: 清理旧备份(保留最近7天)
forfiles /p "%BACKUP_DIR%" /d -7 /c "cmd /c rd /s /q @path"

echo 备份完成!
pause

8.2 日志清理脚本

@echo off
title 日志清理工具
color&nbsp;0c

echo&nbsp;清理系统日志...
wevtutil&nbsp;el&nbsp;|&nbsp;for&nbsp;/f"tokens=*"&nbsp;%%i in ('wevtutil el')&nbsp;do&nbsp;wevtutil&nbsp;cl"%%i"

echo&nbsp;清理应用程序日志...
del /q /f&nbsp;/s&nbsp;"%appdata%\*.log"
del /q /f&nbsp;/s&nbsp;"%localappdata%\*.log"

echo&nbsp;清理IIS日志...
if&nbsp;exist&nbsp;"%systemdrive%\inetpub\logs"&nbsp;(
&nbsp; &nbsp; forfiles /p"%systemdrive%\inetpub\logs"&nbsp;/s /m&nbsp;*.log&nbsp;/d -30&nbsp;/c"cmd /c del @path"
)

echo&nbsp;日志清理完成!
pause

8.3 系统信息收集脚本

@echo off
title 系统信息收集
set&nbsp;LOGFILE=system_info_%date:~0,4%%date:~5,2%%date:~8,2%.txt

echo&nbsp;收集系统信息...
echo&nbsp;==================== >&nbsp;"%LOGFILE%"
echo&nbsp;系统信息报告 >>&nbsp;"%LOGFILE%"
echo&nbsp;生成时间:%date% %time% >>&nbsp;"%LOGFILE%"
echo&nbsp;==================== >>&nbsp;"%LOGFILE%"

:: 基本信息
echo&nbsp;[基本信息] >>&nbsp;"%LOGFILE%"
echo&nbsp;计算机名:%computername% >>&nbsp;"%LOGFILE%"
echo&nbsp;用户名:%username% >>&nbsp;"%LOGFILE%"
echo&nbsp;域:%userdomain% >>&nbsp;"%LOGFILE%"

:: 系统版本
echo&nbsp;[系统版本] >>&nbsp;"%LOGFILE%"
systeminfo | findstr /B /C:"OS Name"&nbsp;/C:"OS Version"&nbsp;>>&nbsp;"%LOGFILE%"

:: 硬件信息
echo&nbsp;[硬件信息] >>&nbsp;"%LOGFILE%"
wmic cpu&nbsp;get&nbsp;Name,NumberOfCores,MaxClockSpeed >>&nbsp;"%LOGFILE%"
wmic memorychip&nbsp;get&nbsp;Capacity,Speed >>&nbsp;"%LOGFILE%"
wmic diskdrive&nbsp;get&nbsp;Model,Size >>&nbsp;"%LOGFILE%"

:: 网络信息
echo&nbsp;[网络信息] >>&nbsp;"%LOGFILE%"
ipconfig /all&nbsp;>>&nbsp;"%LOGFILE%"

echo&nbsp;信息收集完成!
echo&nbsp;日志文件:%LOGFILE%
pause

8.4 批量文件重命名脚本

@echo off
title 批量文件重命名
setlocal&nbsp;enabledelayedexpansion

set&nbsp;/p&nbsp;prefix=请输入文件前缀:
set&nbsp;/p&nbsp;extension=请输入文件扩展名(如:.jpg):

setcount=1
for&nbsp;%%f&nbsp;in (*%extension%)&nbsp;do&nbsp;(
&nbsp; &nbsp;&nbsp;set"newname=%prefix%_!count!%extension%"
&nbsp; &nbsp; ren&nbsp;"%%f""!newname!"
&nbsp; &nbsp;&nbsp;echo&nbsp;重命名:%%f&nbsp;-> !newname!
&nbsp; &nbsp;&nbsp;set&nbsp;/acount+=1
)

echo&nbsp;重命名完成!
pause

九、最佳实践

9.1 代码规范

@echo off
:: ✅ 好的做法
setlocal&nbsp;enabledelayedexpansion
set&nbsp;"variable=value with spaces"
if&nbsp;exist&nbsp;"C:\path with spaces\"&nbsp;(
&nbsp; &nbsp;&nbsp;echo&nbsp;Path&nbsp;exists
)
call&nbsp;:function_name parameter

:: ❌ 避免的做法
set&nbsp;variable=value with spaces
if&nbsp;exist C:\path with spaces\ (
&nbsp; &nbsp;&nbsp;echo&nbsp;Path&nbsp;exists
)
goto&nbsp;function_name

9.2 安全考虑

  • 始终验证用户输入
  • 避免硬编码敏感信息
  • 使用引号包围路径和变量
  • 检查文件/目录是否存在再操作
  • 限制脚本权限

9.3 性能优化

  • 减少不必要的命令调用
  • 使用 xcopy 而不是多次 copy
  • 避免在循环中调用外部程序
  • 使用 findstr 而不是 find 进行复杂搜索

9.4 兼容性考虑

  • 使用 %~dp0 获取脚本目录
  • 避免使用特定于版本的命令
  • 测试不同 Windows 版本
  • 考虑 Unicode 和 ANSI 编码问题

十、常见问题解答

Q1: 如何让脚本在后台运行?

:: 创建 VBS 脚本隐藏运行
echo&nbsp;CreateObject("Wscript.Shell").Run&nbsp;""""&nbsp;^& WScript.Arguments(0) ^&&nbsp;"""",&nbsp;0, False >&nbsp;hide.vbs
cscript //nologo&nbsp;hide.vbs your_script.bat
del&nbsp;hide.vbs

Q2: 如何处理包含空格的路径?

:: 始终使用引号
set&nbsp;"mypath=C:\Program Files\My App"
if&nbsp;exist&nbsp;"%mypath%"&nbsp;(
&nbsp; &nbsp; echo&nbsp;Path&nbsp;exists
)

Q3: 如何获取脚本所在目录?

:: 获取脚本完整路径
echo&nbsp;脚本路径:%~f0

:: 获取脚本所在目录(带反斜杠)
echo&nbsp;脚本目录:%~dp0

:: 获取脚本所在目录(不带反斜杠)
set&nbsp;"scriptdir=%~dp0"
set&nbsp;"scriptdir=%scriptdir:~0,-1%"

Q4: 如何实现睡眠/延迟?

:: 方法1:使用 timeout(推荐)
timeout /t 5 /nobreak >nul

:: 方法2:使用 ping
ping -n 6 127.0.0.1 >nul

:: 方法3:使用 choice(无提示)
choice /c Y /n /d y /t 5 >nul

Q5: 如何处理特殊字符?

:: 转义特殊字符
echo&nbsp;This&nbsp;is&nbsp;a&nbsp;caret:&nbsp;^^
echo&nbsp;This&nbsp;is&nbsp;a&nbsp;percent:&nbsp;%%
echo&nbsp;This&nbsp;is&nbsp;an&nbsp;exclamation: ^!

:: 在延迟扩展中处理感叹号
setlocal&nbsp;disabledelayedexpansion
set&nbsp;"text=Hello! World!"
setlocal&nbsp;enabledelayedexpansion
echo&nbsp;!text!

附录:常用命令速查表

| | | | | — | — | — | | 类别 | 命令 | 用途 | | 文件操作 | copy, xcopy, robocopy | 复制文件 | | move | 移动文件 | | del, erase | 删除文件 | | ren, rename | 重命名 | | 目录操作 | mkdir, md | 创建目录 | | rmdir, rd | 删除目录 | | cd, chdir | 切换目录 | | 系统信息 | systeminfo | 系统详细信息 | | wmic | Windows管理工具 | | tasklist, taskkill | 进程管理 | | 网络 | ipconfig, ping, tracert | 网络诊断 | | netstat, nslookup | 网络状态 | | netsh | 网络配置 | | 用户管理 | net user, net localgroup | 用户组管理 | | whoami | 当前用户信息 | | 服务管理 | net start, net stop | 服务控制 | | sc | 服务配置 |


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:运维星火燎原 刘军军 刘军军《Windows 批处理脚本(.bat / .cmd)编写终极指南》

评论:0   参与:  0