FORFILES无法通过SET命令存储@FSIZE变量值的问题求助
解决FORFILES中变量无法赋值及文件大小比较删除的问题
问题原因
你用FORFILES /P C:\TMP /S /M *.XLSX /C "cmd /c SET MySize=@fsize"无法给父进程的MySize变量赋值,核心原因是:FORFILES会为每个/C参数的命令启动独立的CMD子进程,子进程里设置的环境变量仅在自身有效,不会同步到父进程,所以回到提示符后MySize自然是空值。
解决方案
推荐使用原生的for /r循环替代FORFILES,它在当前CMD进程执行,变量可以正常传递和修改,逻辑更可靠:
脚本实现(保留最大体积的XLSX,删除其余更小的文件)
@echo off setlocal enabledelayedexpansion :: 初始化最大文件大小为0 set "MaxSize=0" :: 第一遍遍历:找到所有XLSX中的最大体积 for /r "C:\TMP" %%f in (*.xlsx) do ( if %%~zf gtr !MaxSize! set "MaxSize=%%~zf" ) :: 第二遍遍历:删除体积小于最大值的XLSX文件 for /r "C:\TMP" %%f in (*.xlsx) do ( if %%~zf lss !MaxSize! del "%%f" ) endlocal
关键细节说明
setlocal enabledelayedexpansion:开启延迟变量扩展,确保循环中修改的MaxSize能被实时读取(否则循环内的变量只会在循环启动前解析一次,无法更新)。%%~zf:获取循环变量%%f对应文件的体积大小,这是CMD原生for循环的内置变量,无需依赖外部工具,稳定性更高。- 两次遍历的逻辑:先确定目标基准大小(最大文件体积),再批量删除不符合条件的文件,避免误删目标文件。
若坚持使用FORFILES的替代方案
如果一定要用FORFILES,可以通过临时文件传递变量值(子进程将大小写入文件,父进程读取文件内容):
@echo off :: 将最大的文件体积写入临时文件 forfiles /P C:\TMP /S /M *.XLSX /C "cmd /c if @fsize gtr %MaxSize% echo @fsize > C:\TMP\max_size.tmp" :: 从临时文件读取最大体积到变量 set /p MaxSize=<C:\TMP\max_size.tmp :: 删除临时文件 del C:\TMP\max_size.tmp :: 删除小于基准体积的XLSX forfiles /P C:\TMP /S /M *.XLSX /C "cmd /c if @fsize lss %MaxSize% del @path"
注意:此方案依赖临时文件,若存在大量文件同时写入,可能出现覆盖问题,稳定性不如
for /r方案。
内容的提问来源于stack exchange,提问作者Ste 007
相关产品推荐
相关产品推荐

