由于硬盘空间不足,系统盘120G,用了好多年,装来卸去了不少软件,残留垃圾不少,所以想清理下,考虑直接重置下系统,然后再把 win11 升级到 25H2 版,最后做个备份。5月中旬就折腾一下,这算是挺顺利的了。
5月底,突然心血来潮,想问下 DeepSeek,做个垃圾清理的批处理,要求适用于 win11 系统,要确保不误删,要自动获取管理员权限。DeepSeek 经过一段时间的深度思考后,生成了一个批处理,我就一键复制保存到桌面,命名为“CleanTemp.bat”,然后直接运行测试了。
运行批处理后,整个D盘都被清空了,只剩下中文目录,以及带空格的目录(如:Program Files),其它文件全部被清理,只剩下空的文件夹,D盘空间是200G,主要放软件,原本快满飘红了,剩余空间就不到20G,现在变成剩余空间有180G多,其中 nZone 文件夹原本至少100G,现只剩下4G多,4万多的文件夹,文件却只有1万多,真是悲催!

文件被误删,比较大的问题是录制的音频全部被清理了,接近6G,然后几乎所有软件要重装,有的绿色软件年代久远,可能就找不到了,浏览器脚本得重新做,好在有个工作脚本文件在别的分区,很多文件要重新整理。
为避免有人错误运行,确认选择的方式就多了好几个Y,用分享链接的方式查看更清楚,我不黑 DeepSeek,但它的确出问题了。
@echo off
title Windows 11 安全垃圾清理工具
color 0A
:: 检查管理员权限
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 正在请求管理员权限...
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
)
cd /d %~dp0
:: 显示欢迎信息
echo ========================================
echo Windows 11 安全垃圾清理工具
echo ========================================
echo.
echo 此工具将安全清理以下位置的临时文件:
echo [1] 当前用户临时目录 ^(%%TEMP%%^)
echo [2] 系统临时目录 ^(%%SystemRoot%%\Temp^)
echo.
echo 注意:不会清理回收站、浏览器缓存等个人数据,
echo 确保不会误删重要文件(实测会误删)
echo.
:: 用户确认
set /p confirm="确认要开始清理吗?(Y/N): "
if /i not "%confirm%"=="YYYYYYYYYYYY" (
echo 已取消清理操作。
pause
exit /b
)
echo.
echo 正在清理临时文件,请稍候...
:: 清理当前用户临时文件夹
if defined TEMP (
if exist "%TEMP%\*" (
echo 正在清理 %TEMP%
call :CleanDir "%TEMP%"
)
)
:: 清理系统临时文件夹
if defined SystemRoot (
set "SysTemp=%SystemRoot%\Temp"
if exist "%SysTemp%\*" (
echo 正在清理 %SysTemp%
call :CleanDir "%SysTemp%"
)
)
echo.
echo 清理完成!所有临时文件已安全移除。
echo 按任意键退出...
pause >nul
exit /b
:CleanDir
:: 安全清空指定目录(保留目录本身,仅删除内部所有文件和子文件夹)
set "dirPath=%~1"
if not exist "%dirPath%\" goto :eof
pushd "%dirPath%" || goto :eof
:: 删除所有文件(包括只读、隐藏文件)
del /f /s /q "%dirPath%\*" >nul 2>&1
:: 删除所有子目录
for /d %%d in ("%dirPath%\*") do (
rd /s /q "%%d" 2>nul
)
popd
goto :eof
DeepSeek:https://chat.deepseek.com/share/u3ln3atdoylj2imyhx

由于是 Win11 环境下的固态硬盘,尝试恢复丢失的文件,只能恢复到大小一致的文件,但基本都打不开,用16进制编辑器查看,里面都是0,能恢复的是极个别的文本文档,但没什么用,有的文件可以看之前的文件夹名重建了,而孤本文件就只能永久丢失了。

豆包:https://www.doubao.com/thread/xd4d57fe2b63e8a6fb05d8a463f9294ec
回头看这代码是哪里出问题,几乎问了所有AI,都说没啥问题,我说运行后所在的D盘被删了,DeepSeek 还没有找到 bug 问题所在,只是说变量的问题,不过也有 AI 反推排查出问题来,具体就不一个个分享了,放一些截图吧。


豆包的表述不够严谨,ChatGPT 不够细节,Claude 表达最清晰,一段话准确完整的表述就是:
cd /d %~dp0 将当前驱动器锁定为D盘。随后由于延迟展开未启用,SysTemp 变量在 if 块内被赋值后立即读取拿到空字符串,空字符串传入清理函数后空路径没有任何防御,导致 * 被解析为D盘根目录,最终删除了D盘所有文件和目录。中文及含空格的目录因路径解析失败而幸存。
事故完整还原如下:
原代码 cd /d %~dp0
→ 当前驱动器锁定为 D:
延迟展开未启用
→ if块内 %SysTemp% 读到空字符串
→ call :CleanDir ""
:CleanDir 收到空参数
→ if not exist "\" → D:\ 存在 → 不跳过
→ pushd "" → 停在 D:\Data\Desktop,返回0
→ del /f /s /q "\*" → D盘所有文件删除
→ for /d in ("\*") → rd D盘所有子目录
→ 纯ASCII目录:成功删除
→ 含空格/中文目录:rd执行出错,静默跳过,幸存
元凶:代码未启用延迟展开,导致 %SysTemp% 在 if 块内赋值后立即读取拿到空字符串,这是100%必然触发的语法错误,与权限和系统版本无关。
帮凶:cd /d %~dp0 将当前驱动器锁定为D盘,使空路径的 * 指向D盘根目录。
两者叠加,导致D盘被递归清空。下面做个纯验证脚本,可以看下:
@echo off
chcp 65001 >nul
title 批处理删盘故障纯验证脚本【无删除】
color 0B
echo ======================================================
echo 前置:cd /d %%~dp0 锁定脚本所在驱动器
echo ======================================================
cd /d %~dp0
echo 脚本完整路径 : %~f0
echo 当前工作目录 : %cd%
echo 当前驱动器 : %cd:~0,2%
echo.
echo ======================================================
echo 测试1:复刻原代码Bug——延迟展开未启用,变量读取失效
echo ======================================================
:: 主动清空SysTemp,排除外部环境干扰,确保复刻原始条件
set "SysTemp="
set "SystemRoot=%SystemRoot%"
if defined SystemRoot (
set "SysTemp=%SystemRoot%\Temp"
echo if块内读到的SysTemp : [%SysTemp%]
echo 预期结果 : [] 空字符串
echo 原因 : 延迟展开未启用,if块内set后立即%%读取%%拿到赋值前旧值
)
echo if块外读到的SysTemp : [%SysTemp%]
echo 预期结果 : [%SystemRoot%\Temp] 已正确赋值
echo.
echo ======================================================
echo 测试2:修复对比——启用延迟展开,变量正常读取
echo ======================================================
setlocal enabledelayedexpansion
set "SysTemp="
if defined SystemRoot (
set "SysTemp=%SystemRoot%\Temp"
echo if块内读到的SysTemp : [!SysTemp!]
echo 预期结果 : [%SystemRoot%\Temp] 正常
)
endlocal
echo.
echo ======================================================
echo 测试3:空路径传入CleanDir的完整危险链
echo ======================================================
call :CleanDirSimulate ""
echo.
echo ======================================================
echo 测试4:正常路径对比(无危险)
echo ======================================================
call :CleanDirSimulate "%SystemRoot%\Temp"
echo.
echo ======================================================
echo 验证完毕,全程无任何del/rd执行,文件零改动
echo ======================================================
pause >nul
exit /b
:: -------------------------------------------------------
:CleanDirSimulate
echo 传入参数 : [%~1]
set "dirPath=%~1"
echo dirPath值 : [%dirPath%]
echo.
echo -- 危险拼接模拟 --
set "delTarget=%dirPath%\*"
echo del目标字符串 : [%delTarget%]
if "%dirPath%"=="" (
echo 【致命】\* = 当前驱动器根目录 %cd:~0,2%\*
echo 等效命令 : del /f /s /q %cd:~0,2%\*
) else (
echo 【安全】仅清理指定目录,不涉及根目录
)
echo.
echo -- if not exist空路径检查 --
if not exist "%dirPath%\" (
echo if not exist结果 : 目录不存在,会跳过 [安全]
) else (
echo if not exist结果 : 判断为存在,不跳过 [危险]
if "%dirPath%"=="" (
echo 原因 : \ 被解析为 %cd:~0,2%\ 即盘符根目录,必然存在
)
)
echo.
echo -- pushd空路径行为验证 --
set "beforeDir=%cd%"
pushd "%dirPath%"
echo pushd前目录 : %beforeDir%
echo pushd后目录 : %cd%
echo pushd返回码errorlevel : %errorlevel%
if "%errorlevel%"=="0" (
echo 结论 : pushd返回成功,^|^| 不触发,代码继续往下执行
) else (
echo 结论 : pushd失败,^|^| 会跳过
)
popd
echo.
echo -- for /d枚举模拟(实际rd目标)--
echo for /d枚举 "%dirPath%\*" 结果:
for /d %%d in ("%dirPath%\*") do (
echo 实际rd目标 : [%%d]
)
echo --------------------------
goto :eof
不知道笔者这是个例还是也有其他人遇到,不要太相信 AI 了,不确定的要多验证一下。这次被 DeepSeek 写的 bug 脚本坑惨了,被删盘后,感觉都有阴影了,以后不要随意运行 AI 生成的危险脚本,真的是要慎之又慎。



