在编写 .cmd
批处理文件时,通常需要遵循一些基本的框架和结构,以确保脚本的可读性和可维护性。以下是一个基础的 .cmd
批处理文件框架:
@echo off
REM ============================================
REM 脚本名称: 你的脚本名称.cmd
REM 描述: 这个脚本的功能描述
REM 作者: 你的名字
REM 创建日期: YYYY-MM-DD
REM 修改记录:
REM YYYY-MM-DD - 修改描述
REM ============================================REM 设置变量
set "VAR_NAME=value"REM 主逻辑开始
echo 开始执行脚本...REM 调用函数或执行命令
call :function_nameREM 主逻辑结束
echo 脚本执行完毕。REM 退出脚本
exit /bREM ============================================
REM 函数定义
REM ============================================:function_nameREM 函数逻辑echo 这是函数 function_name 的执行部分。REM 返回goto :eofREM ============================================
REM 其他函数或逻辑
REM ============================================REM 脚本结束
解释:
-
@echo off: 关闭命令回显,使脚本执行时不会显示每一行命令。
-
REM: 注释行,用于解释脚本的功能或记录修改历史。
-
set: 设置变量,变量名和值之间用等号连接。
-
echo: 输出信息到控制台。
-
call: 调用函数或另一个批处理文件。
-
exit /b: 退出脚本,
/b
参数表示退出当前批处理文件,而不是退出命令提示符。 -
:function_name : 定义一个函数,函数名以冒号开头。
-
goto :eof : 跳转到脚本的末尾,通常用于函数返回。
示例:
假设你想编写一个简单的批处理脚本,用于备份某个文件夹的内容:
@echo off
REM ============================================
REM 脚本名称: backup_script.cmd
REM 描述: 备份指定文件夹的内容到另一个位置
REM 作者: 你的名字
REM 创建日期: 2023-10-01
REM ============================================REM 设置变量
set "SOURCE_DIR=C:\path\to\source"
set "BACKUP_DIR=C:\path\to\backup"
set "BACKUP_NAME=backup_%date:~-4,4%%date:~-7,2%%date:~-10,2%"REM 主逻辑开始
echo 开始备份...REM 创建备份目录
if not exist "%BACKUP_DIR%\%BACKUP_NAME%" (mkdir "%BACKUP_DIR%\%BACKUP_NAME%"
)REM 复制文件
xcopy "%SOURCE_DIR%\*" "%BACKUP_DIR%\%BACKUP_NAME%\" /s /e /h /yREM 主逻辑结束
echo 备份完成。REM 退出脚本
exit /b
这个脚本会将指定源文件夹的内容备份到目标文件夹,并在目标文件夹中创建一个以当前日期命名的子文件夹。
注意事项:
-
批处理脚本中的路径和文件名不要包含空格,如果必须包含空格,请使用引号括起来。
-
使用
set
命令设置变量时,等号两边不要有空格。 -
使用
xcopy
或其他命令时,注意参数的含义和使用方法。
这个框架可以帮助你快速开始编写 .cmd
批处理脚本,并根据需要进行扩展和修改。
进一步扩展 .cmd
批处理脚本的功能,并介绍一些常用的技巧和高级用法,帮助你编写更强大和灵活的脚本。
1. 参数传递
批处理脚本可以接收外部传递的参数,使用 %1
、%2
、%3
等来引用参数。例如:
@echo off
REM 脚本名称: example.cmd
REM 描述: 演示如何接收参数REM 检查是否传递了参数
if "%~1"=="" (echo 错误:请提供参数。exit /b 1
)REM 使用参数
echo 第一个参数: %1
echo 第二个参数: %2
运行脚本时:
example.cmd Hello World
输出:
第一个参数: Hello
第二个参数: World
2. 错误处理
在批处理脚本中,可以使用 errorlevel
来检查上一条命令的执行结果。如果命令成功,errorlevel
通常为 0
;如果失败,则为非零值。
@echo off
REM 脚本名称: error_handling.cmd
REM 描述: 演示错误处理REM 尝试执行一个命令
xcopy non_existent_file.txt C:\backup\ /yREM 检查命令是否成功
if %errorlevel% neq 0 (echo 错误:文件复制失败!exit /b %errorlevel%
)echo 文件复制成功!
3. 条件判断
批处理脚本支持 if
语句,可以用于条件判断。常用的比较运算符包括:
-
==
:等于 -
neq
:不等于 -
lss
:小于 -
leq
:小于或等于 -
gtr
:大于 -
geq
:大于或等于
示例:
@echo off
REM 脚本名称: condition.cmd
REM 描述: 演示条件判断set "NUM=10"if %NUM% gtr 5 (echo %NUM% 大于 5
) else (echo %NUM% 小于或等于 5
)
4. 循环
批处理脚本支持 for
循环,可以用于遍历文件、目录或字符串。
遍历文件
@echo off
REM 脚本名称: loop_files.cmd
REM 描述: 遍历当前目录下的所有 .txt 文件for %%f in (*.txt) do (echo 找到文件: %%f
)
遍历目录
@echo off
REM 脚本名称: loop_dirs.cmd
REM 描述: 遍历当前目录下的所有子目录for /d %%d in (*) do (echo 找到目录: %%d
)
遍历字符串
@echo off
REM 脚本名称: loop_string.cmd
REM 描述: 遍历字符串中的每个单词set "STR=Apple Banana Cherry"for %%s in (%STR%) do (echo 单词: %%s
)
5. 用户输入
使用 set /p
可以让用户输入数据。
@echo off
REM 脚本名称: user_input.cmd
REM 描述: 获取用户输入set /p USER_NAME=请输入你的名字:
echo 你好, %USER_NAME%!
6. 日志记录
将脚本的输出记录到日志文件中,方便后续查看。
@echo off
REM 脚本名称: logging.cmd
REM 描述: 记录日志set "LOG_FILE=script_log.txt"REM 将输出重定向到日志文件
echo [%date% %time%] 脚本开始执行 >> %LOG_FILE%REM 主逻辑
echo 正在执行任务... >> %LOG_FILE%
timeout 2 >nulecho [%date% %time%] 脚本执行完毕 >> %LOG_FILE%
7. 调用外部程序
可以在批处理脚本中调用其他程序或脚本。
@echo off
REM 脚本名称: call_external.cmd
REM 描述: 调用外部程序REM 调用记事本
notepad.exeREM 调用另一个批处理脚本
call another_script.cmd
8. 延迟变量扩展
在循环或条件语句中,如果需要动态修改变量的值,可以使用延迟变量扩展。
@echo off
REM 脚本名称: delayed_expansion.cmd
REM 描述: 演示延迟变量扩展setlocal enabledelayedexpansionset "COUNT=0"for /l %%i in (1,1,5) do (set /a COUNT+=1echo 当前计数: !COUNT!
)endlocal
9. 退出代码
在脚本结束时,可以使用 exit /b
返回一个退出代码,供外部程序判断脚本的执行状态。
@echo off
REM 脚本名称: exit_code.cmd
REM 描述: 返回退出代码REM 模拟成功
exit /b 0REM 模拟失败
REM exit /b 1
10. 综合示例
以下是一个综合示例,结合了参数传递、条件判断、循环和日志记录:
@echo off
REM 脚本名称: backup_script.cmd
REM 描述: 备份指定文件夹的内容到另一个位置,并记录日志REM 检查参数
if "%~1"=="" (echo 错误:请提供源文件夹路径。exit /b 1
)if "%~2"=="" (echo 错误:请提供目标文件夹路径。exit /b 1
)REM 设置变量
set "SOURCE_DIR=%~1"
set "BACKUP_DIR=%~2"
set "BACKUP_NAME=backup_%date:~-4,4%%date:~-7,2%%date:~-10,2%"
set "LOG_FILE=%BACKUP_DIR%\backup_log.txt"REM 记录日志
echo [%date% %time%] 开始备份 %SOURCE_DIR% 到 %BACKUP_DIR%\%BACKUP_NAME% >> %LOG_FILE%REM 创建备份目录
if not exist "%BACKUP_DIR%\%BACKUP_NAME%" (mkdir "%BACKUP_DIR%\%BACKUP_NAME%"
)REM 复制文件
xcopy "%SOURCE_DIR%\*" "%BACKUP_DIR%\%BACKUP_NAME%\" /s /e /h /yREM 检查是否成功
if %errorlevel% neq 0 (echo [%date% %time%] 错误:文件复制失败! >> %LOG_FILE%exit /b %errorlevel%
)REM 记录日志
echo [%date% %time%] 备份完成。 >> %LOG_FILE%
exit /b 0
通过以上内容,你可以编写功能更强大的批处理脚本。