0、前言:
- 这个案例是在工作中,产生的实践需求。在工作中,可能会多个同事公用一台电脑,这种情况下,如何保护好自己的文件不被别人怎删改查就是棘手的事。
1、根据实际需求逐条分析需求模块:
- 一键锁定文件夹:将普通文件夹伪装成系统回收站(CLSID),并设置隐藏 + 系统属性,普通方式无法查看、打开、删除。
- 密码解锁:输入正确密码才能将锁定文件夹恢复为普通可访问文件夹。
- 自动重新锁定:解锁打开文件夹后,关闭窗口按任意键即可再次上锁。
- 自动初始化:第一次运行时自动创建目标文件夹并直接锁定。
- 状态自动识别:程序启动时自动判断文件夹是已锁定 / 已解锁 / 未创建,并执行对应逻辑。
- 安全隐蔽:不修改注册表、不删除文件、不依赖第三方软件,纯系统命令实现隐私文件夹保护。
2、批处理源码:
bash
@echo off
:: 知识点1:@echo off ------ 关闭命令回显,不显示执行的命令本身
:: 知识点2::: 注释 ------ 批处理行注释,不执行
setlocal enabledelayedexpansion
:: 知识点3:setlocal ------ 开启局部环境,变量不影响系统环境
:: 知识点4:enabledelayedexpansion ------ 开启**延迟变量扩展**,用于在 if 代码块中使用 !变量!
title Simple Folder Locker
:: 知识点5:title ------ 设置CMD窗口标题
color 2
:: 知识点6:color ------ 设置CMD文字颜色(2=绿色)
set "BASE=D:\"
set "NORMALFOLDER=zhmf"
set "UNLOCKPWD=123666"
set "LOCKEDCLSID={645FF040-5081-101B-9F08-00AA002F954E}"
set "LOCKEDFOLDER=zhmf.%LOCKEDCLSID%"
:: 知识点7:set 变量定义 ------ 定义字符串变量
:: 知识点8:set "变量=值" ------ 安全写法,防止空格/特殊符号出错
cd /d "%BASE%"
:: 知识点9:cd /d ------ 跨盘符切换目录(自动进入D盘)
if exist "%LOCKEDFOLDER%\*" (
set STATUS=LOCKED
echo STATUS=LOCKED
) else if exist "%NORMALFOLDER%" (
set STATUS=UNLOCKED
echo STATUS=UNLOCKED
) else (
set STATUS=UNKNOWN
echo STATUS=UNKNOWN!
)
:: 知识点10:if exist ------ 判断文件/文件夹是否存在
:: 知识点11:if ... else if ... else ------ 多分支条件判断
:: 知识点12:%变量% ------ 普通变量引用
:: 知识点13:代码块 () ------ 多行命令合并为一个逻辑块
:: 首次创建
if "%STATUS%"=="UNKNOWN" (
echo ====================== FIRST RUN ======================
md "%NORMALFOLDER%"
ren "%NORMALFOLDER%" "%LOCKEDFOLDER%"
attrib +h +s "%LOCKEDFOLDER%"
echo 文件夹已锁定在 D:\zhmf
pause >nul
exit
)
:: 知识点14:md ------ 创建文件夹(mkdir)
:: 知识点15:ren ------ 重命名文件/文件夹
:: 知识点16:attrib +h +s ------ 给文件夹添加**隐藏**、**系统**属性
:: 知识点17:pause >nul ------ 暂停并隐藏"请按任意键继续"提示
:: 知识点18:exit ------ 退出批处理程序
:: 解锁
if "%STATUS%"=="LOCKED" (
echo ====================== UNLOCK FOLDER ======================
set /p INPUTPWD=Enter unlock password:
if not "!INPUTPWD!"=="%UNLOCKPWD%" (
echo ERROR: Wrong password!
pause >nul
exit
)
attrib -h -s "%LOCKEDFOLDER%"
ren "%LOCKEDFOLDER%" "%NORMALFOLDER%"
start "" "%NORMALFOLDER%"
echo.
echo 关闭文件夹窗口后按任意键锁定
pause >nul
ren "%NORMALFOLDER%" "%LOCKEDFOLDER%"
attrib +h +s "%LOCKEDFOLDER%"
echo 锁定成功!
pause >nul
exit
)
:: 知识点19:set /p ------ 接收用户键盘输入(用于输入密码)
:: 知识点20:!变量! ------ 延迟变量读取(必须在 if 代码块内使用)
:: 知识点21:if not ------ 条件取反(判断密码不相等)
:: 知识点22:attrib -h -s ------ 移除隐藏、系统属性
:: 知识点23:start ------ 打开文件夹/程序
:: 知识点24:echo. ------ 输出空行,美化界面
:: 已解锁 → 上锁
if "%STATUS%"=="UNLOCKED" (
echo ====================== WARNING ======================
echo Folder: D:\%NORMALFOLDER%
echo Press any key to re-lock it...
pause >nul
ren "%NORMALFOLDER%" "%LOCKEDFOLDER%"
if errorlevel 1 (
echo ERROR: Access denied!
pause >nul
exit
)
attrib +h +s "%LOCKEDFOLDER%"
echo.
echo 文件夹已成功锁定!
pause >nul
exit
)
:: 知识点25:errorlevel ------ 判断上一条命令是否执行失败(重命名失败=文件夹被占用)
3、梳理总结:

4、后续可以提升的地方:
- 密码不要明文写在脚本里现在密码 123666 直接能看到,别人打开脚本就泄露了。改进:改成 MD5 验证 或 密码存在外部隐藏文件。
- 加密码错误次数限制现在输错一次就退出,可暴力试密码。改进:输错 3 次自动退出、锁屏警告。
- 锁定后不能轻易改名破解现在只是改个名 + 隐藏,懂的人能手动改回去。改进:加 文件夹权限锁定,即使显示出来也打不开。
- 自动判断文件夹是否被占用现在文件夹打开着就无法锁定,还不提示。改进:自动检测占用 → 提示关闭 → 再锁定。
- 加主菜单,不用自动判断状态现在自动判断,有时候会懵。
bash
[1] 解锁文件夹
[2] 锁定文件夹
[3] 修改密码
- 现在脚本必须放 D 盘,换盘就失效。改进:让文件夹自动在脚本同目录创建,放哪都能用。