欢迎来到 CMD 脚本第三课!今天我们将学习文件/目录管理和函数封装,让你的脚本具备更强的系统操作能力。
1. 文件与目录操作
(1) 创建/删除目录
命令 | 作用 | 示例 |
---|---|---|
mkdir 或 md |
创建目录 | mkdir Backup |
rmdir 或 rd |
删除空目录 | rmdir EmptyDir |
rmdir /s /q |
强制删除非空目录 | rmdir /s /q OldProjects |
示例:带容错判断的目录操作
@echo off
if not exist "D:\Backup\" (
mkdir D:\Backup
echo 备份目录已创建
) else (
echo 备份目录已存在
)
(2) 复制/移动/删除文件
命令 | 作用 | 示例 |
---|---|---|
copy |
复制文件 | copy file.txt D:\Backup\ |
xcopy |
复制目录(含子目录) | xcopy /e /i Source Dest |
move |
移动/重命名文件 | move old.txt new.txt |
del 或 erase |
删除文件 | del *.tmp /q |
示例:备份当日文件
@echo off
set "date=%DATE:~0,10%"
xcopy /y "C:\Reports\*.xlsx" "D:\Backup\%date%\" >nul
echo 文件已备份至 D:\Backup\%date%\
(3) 文件属性操作
命令 | 作用 |
---|---|
attrib +h |
隐藏文件 |
attrib -r |
取消只读属性 |
示例:保护重要文件
@echo off
attrib +h +r "C:\Secret\passwords.txt"
2. 函数封装
(1) 定义和调用函数
CMD 通过 call :label
模拟函数:
@echo off
call :say_hello "Alice"
exit /b
:say_hello
echo Hello, %~1!
exit /b
关键点:
%~1
获取第一个参数(去掉引号)exit /b
结束函数(不退出脚本)
(2) 返回值处理
通过变量传递结果:
@echo off
call :sum 10 20 result
echo 10 + 20 = %result%
exit /b
:sum
set /a "%~3=%~1 + %~2"
exit /b
3. 综合案例
自动清理7天前的日志文件
@echo off
set "log_dir=C:\Logs"
set "days=7"
call :clean_old_files "%log_dir%" %days%
exit /b
:clean_old_files
forfiles /p "%~1" /m *.log /d -%~2 /c "cmd /c del @path /q"
echo 已清理 %~1 中超过 %~2 天的日志
exit /b
4. 错误处理进阶
(1) 错误日志记录
@echo off
call :task >"C:\Logs\script.log" 2>&1
exit /b
:task
echo 开始执行任务...
xcopy /invalidparam || (
echo [ERROR] 命令执行失败 >>"C:\Logs\errors.log"
exit /b 1
)
5. 练习任务
- 写一个脚本:将
C:\Source
下所有.docx
文件复制到D:\Backup
,并记录成功/失败的文件名 - 挑战任务:创建函数
:get_file_count
统计指定扩展名的文件数量
练习答案
任务1:带日志的文件备份
@echo off
set "source=C:\Source"
set "backup=D:\Backup"
set "log=backup_log_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt"
echo 备份开始:%TIME% >"%log%"
for %%f in ("%source%\*.docx") do (
copy "%%f" "%backup%\" >nul 2>&1
if %errorlevel%==0 (
echo [OK] %%f >>"%log%"
) else (
echo [FAILED] %%f >>"%log%"
)
)
echo 备份完成:%TIME% >>"%log%"
任务2:文件统计函数
@echo off
call :get_file_count "C:\Photos" "jpg" count
echo 找到 %count% 个 .jpg 文件
exit /b
:get_file_count
set /a "%~3=0"
for /f %%a in ('dir /b "%~1\*.%~2" 2^>nul ^| find /c /v ""') do set "%~3=%%a"
exit /b
6. 下一步学习
- 第四课:注册表操作(
reg
命令)和网络管理(netsh
/ping
) - 第五课:与PowerShell混合编程
掌握这些技能后,你将能处理90%的Windows自动化需求。 🛠️
这一切,似未曾拥有