求助:完善批量脚本,遍历文件/文件夹并按磁盘大小重命名
解决方案
问题1:遍历所有文件、文件夹及子目录
借助PowerShell的Get-ChildItem -Recurse命令可以递归遍历目标目录下的所有文件与文件夹,同时直接获取每个项的完整路径和磁盘占用大小,无需单独编写.ps1文件,嵌入CMD命令即可实现。
问题2:FOR /F中执行多命令的正确写法
CMD的FOR /F语法里,DO后要执行多个命令需注意两点:
- 用
&连接命令,或用()包裹命令块 - 开启延迟变量扩展(
setlocal enabledelayedexpansion),避免循环内变量被提前解析,确保每次循环读取变量最新值
修正后的完整脚本
@ECHO OFF setlocal enabledelayedexpansion set "targetDir=E:\Desktop\Folder" set "maxbytesize=1" :: PowerShell递归遍历所有项,输出「路径|大小」格式内容 FOR /F "delims=| tokens=1,2" %%a IN (' PowerShell -ExecutionPolicy Bypass -Command "Get-ChildItem -Path '%targetDir%' -Recurse | ForEach-Object { $size = if ($_.PSIsContainer) { (Get-ChildItem $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum } else { $_.Length }; Write-Output ('{0}|{1}' -f $_.FullName, $size) }" ') DO ( set "itemPath=%%a" set "sizeOnDisk=%%b" :: 修正原脚本逻辑:大小大于1字节时重命名 if !sizeOnDisk! GTR %maxbytesize% ( :: 区分文件与文件夹的重命名逻辑 if exist "!itemPath!\" ( ren "!itemPath!" "%%~na-DELETED%%~xa" ) else ( ren "!itemPath!" "%%~na-DELETED%%~xa" ) ) ) endlocal EXIT
关键说明
- 延迟变量扩展:用
!变量名!替代%变量名%,确保循环内变量值实时更新 - PowerShell逻辑:文件直接取
$_.Length作为大小;文件夹则递归计算其下所有文件总大小(若需文件夹自身占用大小,可替换为(Get-ItemProperty $_.FullName).Length) - 重命名规则:通过
%%~na获取名称、%%~xa获取扩展名,重命名后格式为原名称-DELETED(文件保留扩展名)
内容的提问来源于stack exchange,提问作者ShaunTheBaa
相关产品推荐
相关产品推荐

