Windows 命令提示符脚本
最后修改于 2025 年 7 月 14 日
命令提示符脚本允许在 Windows 中自动化重复性任务。批处理文件 (.bat 或 .cmd) 包含由 cmd.exe 执行的命令序列。脚本通过将多个命令合并到可重用文件中来节省时间。它通过变量、循环和条件来实现复杂操作。本教程将通过实际示例介绍重要的脚本概念。
批处理文件是包含逐行执行命令的纯文本文件。它们支持变量和流程控制等基本编程结构。脚本可以接受参数并通过提示与用户交互。错误处理和日志记录使脚本在生产环境中更加健壮。理解批处理脚本对于 Windows 系统管理很有价值。
脚本从简单的命令序列开始,然后发展到复杂的逻辑。@echo off 命令可阻止命令回显,使输出更清晰。注释以 :: 或 REM 开头,用于记录脚本功能。环境变量用于存储系统信息和脚本配置。正确的结构和组织可以使脚本易于维护和重用。
本教程演示了从基本到高级的实际脚本示例。每个示例都侧重于特定的脚本概念或技术。通过跟随学习,您将能够构建自己的自动化脚本。示例从简单的文件操作进展到系统管理。让我们从基础脚本概念和示例开始。
基本定义
批处理文件:带有 .bat 或 .cmd 扩展名,包含 cmd 命令的文本文件。变量:用于存储值的命名空间,在脚本中引用为 %varname%。参数:传递给脚本的值,通过 %1 到 %9 访问。流程控制:如 if、for 和 goto 等改变执行的命令。重定向:如 > 和 >> 等控制输入/输出流的运算符。
环境变量:系统范围或用户特定的配置值。命令替换:使用命令输出作为输入,使用 %(command)%。错误级别:指示命令成功或失败的数字代码。标签:goto 命令的标记,定义为 :labelname。函数:通过 call :function 调用可重用的代码块。
示例 1:基本文件备份脚本
此脚本演示了一个简单的文件备份操作。它将文件从源目录复制到目标目录,并带有时间戳。该脚本展示了基本的变量使用和命令执行。
@echo off setlocal :: Set source and destination folders set SOURCE=C:\Work\Documents set DEST=C:\Backups\Documents_%date:~-4,4%%date:~-10,2%%date:~-7,2% :: Create destination folder if it doesn't exist if not exist "%DEST%" mkdir "%DEST%" :: Copy files echo Backing up files from %SOURCE% to %DEST%... xcopy "%SOURCE%\*.*" "%DEST%\" /E /H /C /I /Q /Y echo Backup completed successfully. endlocal
此脚本创建文档的日期备份。它使用环境变量来指定路径,并使用 xcopy 进行健壮的文件复制。日期格式为 YYYYMMDD。
set SOURCE=C:\Work\Documents
定义包含要备份文件的源目录。请将此路径更改为匹配您的源位置。环境变量使路径可配置。
set DEST=C:\Backups\Documents_%date:~-4,4%%date:~-10,2%%date:~-7,2%
创建目标路径并附加当前日期。%date% 变量被解析以提取年份、月份和日期组件作为文件夹名称。
if not exist "%DEST%" mkdir "%DEST%"
检查目标文件夹是否存在,如果不存在则创建。if not exist 条件可防止文件夹已存在时出错。
xcopy "%SOURCE%\*.*" "%DEST%\" /E /H /C /I /Q /Y
递归复制所有文件及其属性。xcopy 开关启用子目录(/E)、隐藏文件(/H)和在错误时继续(/C)。
C:\>backup.bat Backing up files from C:\Work\Documents to C:\Backups\Documents_20250215... 10 File(s) copied Backup completed successfully.
运行脚本将显示进度和完成消息。实际文件计数取决于您的源目录内容。
示例 2:用户输入和条件处理
此脚本演示了交互式输入和条件逻辑。它提示用户输入,并根据提供的值做出不同的响应。此示例展示了脚本中的基本决策制定。
@echo off
setlocal
:: Prompt for user input
set /p choice=Do you want to continue (Y/N)?
:: Convert input to uppercase for case-insensitive comparison
set choice=%choice:~0,1%
set choice=%choice:y=Y%
set choice=%choice:n=N%
:: Process user choice
if "%choice%"=="Y" (
echo Proceeding with operation...
timeout /t 3 >nul
echo Operation completed.
) else if "%choice%"=="N" (
echo Operation cancelled by user.
) else (
echo Invalid input. Please enter Y or N.
)
endlocal
此脚本在继续之前处理用户确认。它演示了输入验证和多个条件分支。超时模拟了处理过程。
set /p choice=Do you want to continue (Y/N)?
提示用户输入并将响应存储在“choice”变量中。/p 开关允许在批处理文件中进行交互式输入。
set choice=%choice:~0,1% set choice=%choice:y=Y% set choice=%choice:n=N%
通过获取第一个字符并转换为大写来规范化输入。这使得比较不区分大小写,同时接受“y”或“n”。
if "%choice%"=="Y" (
echo Proceeding with operation...
timeout /t 3 >nul
echo Operation completed.
)
如果用户输入“Y”,则执行此块。超时暂停 3 秒(>nul 抑制输出)以模拟工作。
) else if "%choice%"=="N" (
echo Operation cancelled by user.
)
处理否定响应情况。else if 结构允许在批处理脚本中使用多个条件。
C:\>interactive.bat Do you want to continue (Y/N)? y Proceeding with operation... Operation completed.
示例输出显示了成功执行的路径。脚本对“N”或无效输入做出不同的响应。
示例 3:处理多个文件
此脚本演示了如何使用 for 循环处理多个文件。它搜索文本文件并在每个文件上执行操作。此示例展示了批处理文件的迭代功能。
@echo off
setlocal enabledelayedexpansion
:: Set working directory
set WORKDIR=C:\Reports
cd /d "%WORKDIR%"
:: Process each text file
echo Processing text files in %WORKDIR%...
for %%f in (*.txt) do (
echo ----------------------------
echo Processing: %%f
echo File size: %%~zf bytes
echo Last modified: %%~tf
:: Count lines in file
set linecount=0
for /f %%i in ('type "%%f" ^| find /c /v ""') do set linecount=%%i
echo Lines: !linecount!
:: Create backup copy
copy "%%f" "%%~nf.bak" >nul
echo Created backup: %%~nf.bak
)
echo ----------------------------
echo Finished processing files.
endlocal
此脚本分析文本文件并创建备份。它演示了文件迭代、属性访问和嵌套命令。延迟扩展处理循环中的变量。
setlocal enabledelayedexpansion
为循环中的动态值启用延迟变量扩展。在代码块中修改和访问变量时需要。
for %%f in (*.txt) do (
迭代当前目录中的所有 .txt 文件。%%f 变量在迭代过程中保存每个文件名。
echo Processing: %%f echo File size: %%~zf bytes echo Last modified: %%~tf
显示文件名和属性。修饰符 ~z(大小)和 ~t(时间戳)从循环变量中提取文件属性。
for /f %%i in ('type "%%f" ^| find /c /v ""') do set linecount=%%i
计算当前文件的行数。for /f 处理命令输出,find /c 计数行。脱字符(^)会转义管道以用于嵌套命令。
C:\>process_files.bat Processing text files in C:\Reports... ------------------------ Processing: report1.txt File size: 1024 bytes Last modified: 02/14/2025 10:30 AM Lines: 42 Created backup: report1.bak ------------------------ Finished processing files.
输出显示文件处理详细信息。每个文本文件都经过类似处理,并显示其特定属性。
示例 4:系统维护脚本
此脚本执行常见的系统维护任务。它清理临时文件,检查磁盘空间,并生成报告。此示例展示了管理脚本技术。
@echo off setlocal set LOGFILE=%TEMP%\maintenance_%date:~-4,4%%date:~-10,2%%date:~-7,2%.log :: Start logging echo System Maintenance Report > "%LOGFILE%" echo Date: %date% %time% >> "%LOGFILE%" echo ==================================== >> "%LOGFILE%" :: Clean temp files echo [1/3] Cleaning temporary files... del /q /f /s "%TEMP%\*.*" 2>nul echo Temp files cleaned. >> "%LOGFILE%" :: Check disk space echo [2/3] Checking disk space... echo Disk Space: >> "%LOGFILE%" wmic logicaldisk get caption,freespace,size /format:list >> "%LOGFILE%" :: List running services echo [3/3] Checking running services... echo Running Services: >> "%LOGFILE%" sc query state= running >> "%LOGFILE%" :: Complete echo Maintenance completed. Log saved to %LOGFILE% endlocal
此脚本自动化例行系统检查。它演示了日志记录、错误处理和系统命令。输出被保存到带日期的日志文件中。
set LOGFILE=%TEMP%\maintenance_%date:~-4,4%%date:~-10,2%%date:~-7,2%.log
在临时目录中创建日志文件路径并附加当前日期。%TEMP% 变量指向系统临时文件夹。
del /q /f /s "%TEMP%\*.*" 2>nul
安静地删除临时目录中的所有文件。/q 启用安静模式,/f 强制删除,/s 包含子目录。错误被隐藏(2>nul)。
wmic logicaldisk get caption,freespace,size /format:list >> "%LOGFILE%"
使用 WMIC 获取磁盘空间信息。输出格式化为列表并追加到日志文件中。
sc query state= running >> "%LOGFILE%"
列出所有正在运行的 Windows 服务。sc 命令查询服务控制管理器以获取服务状态信息。
C:\>maintenance.bat [1/3] Cleaning temporary files... [2/3] Checking disk space... [3/3] Checking running services... Maintenance completed. Log saved to C:\Users\user\AppData\Local\Temp\maintenance_20250215.log
脚本显示进度和完成消息。详细结果位于指定位置的日志文件中。
示例 5:带有函数的进阶脚本
此示例演示了一个带有函数和错误处理的进阶脚本。它为系统信息提供了一个菜单驱动的界面。该脚本展示了模块化的批处理编程技术。
@echo off setlocal enabledelayedexpansion :: Main script loop :menu cls echo System Information Menu echo ---------------------- echo 1. Display OS Information echo 2. Display Hardware Details echo 3. Display Network Configuration echo 4. Display Running Processes echo 5. Exit echo ---------------------- set /p choice=Enter your choice [1-5]: :: Validate input if "!choice!"=="" goto invalid if "!choice!"=="1" goto osinfo if "!choice!"=="2" goto hardware if "!choice!"=="3" goto network if "!choice!"=="4" goto processes if "!choice!"=="5" exit /b goto invalid :: Function definitions :osinfo call :header "Operating System Information" systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type" pause goto menu :hardware call :header "Hardware Information" echo CPU: wmic cpu get name echo. echo Memory: wmic memorychip get capacity echo. echo Disks: wmic diskdrive get model,size pause goto menu :network call :header "Network Configuration" ipconfig | findstr IPv4 echo. arp -a pause goto menu :processes call :header "Running Processes" tasklist pause goto menu :invalid echo Invalid selection. Please try again. pause goto menu :header echo. echo ==================================== echo %~1 echo ==================================== echo. goto :eof
此脚本提供了一个菜单驱动的系统信息工具。它展示了函数、模块化