ZetCode

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:基本文件备份脚本

此脚本演示了一个简单的文件备份操作。它将文件从源目录复制到目标目录,并带有时间戳。该脚本展示了基本的变量使用和命令执行。

backup.bat
@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:用户输入和条件处理

此脚本演示了交互式输入和条件逻辑。它提示用户输入,并根据提供的值做出不同的响应。此示例展示了脚本中的基本决策制定。

interactive.bat
@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 循环处理多个文件。它搜索文本文件并在每个文件上执行操作。此示例展示了批处理文件的迭代功能。

process_files.bat
@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:系统维护脚本

此脚本执行常见的系统维护任务。它清理临时文件,检查磁盘空间,并生成报告。此示例展示了管理脚本技术。

maintenance.bat
@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:带有函数的进阶脚本

此示例演示了一个带有函数和错误处理的进阶脚本。它为系统信息提供了一个菜单驱动的界面。该脚本展示了模块化的批处理编程技术。

sysinfo_menu.bat
@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

此脚本提供了一个菜单驱动的系统信息工具。它展示了函数、模块化