首页 > 解决方案 > 使用powershell命令批处理脚本检查文件夹大小

问题描述

我对批处理脚本非常陌生,我的脚本中有一个部分遗漏了。

基本上我想检查一个特定的文件夹(带有子文件夹)是否在一个特定的大小范围之间。该文件夹的正常大小约为 200GB,所以我读到您无法在批处理命令中检查大小,因为 cmd 最多只能工作 2GB。所以我需要在批处理脚本中使用 power-shell 命令。因此,在批处理脚本中,我将使用 power-shell 命令检查文件夹大小 >190GB 和 <250GB,如果它在所需范围内,该命令将返回一个返回值。

我找到了以下命令:

powershell -ExecutionPolicy Unrestricted -c "{0:N2} MB" -f ((Get-ChildItem C:\patch\to\file -Recurse | Measure-Object -Property Length -Sum -ErrorAction Stop).Sum / 1MB)

如果你只是在 Powershell 中输入代码,你会得到一个带有特定文件夹 MB 的返回值,但我不知道如何从那里开始。

标签: powershellbatch-file

解决方案


一般来说,我同意 PowerShell 是更现代且功能更丰富的 shell,但如果这不可行:

  • 在您的 PowerShell 命令中,您需要使用反斜杠转义双引号并使用插入符号转义管道,以防止它们被 cmd.exe 解释
  • 批处理需要一个纯整数,因此将格式说明符更改\"{0:N2} MB\"\"{0:N0}\"
  • 批量处理另一个命令的输出for /f

:: Q:\Test\2018\05\09\SO_50247759.cmd
@Echo off
Set "Folder=C:\Test"
:: TargetSize in  GB * 1024 = MB
:: _PlusMinus as percent
:: _UpperB, _LowerB  are the calculated bounds
:: you may set bounds to fixed values
Set /A _TargetSize=200*1024, _PlusMinus=5, _Upperb=_TargetSize+_TargetSize*_PlusMinus/100, _LowerB=_TargetSize-_TargetSize*_PlusMinus/100
For /f "delims=" %%S in ('
powershell -Exec Unrestricted -c \"{0:N0}\" -f ((GCI \"%Folder%\" -R^^^|Measure Length -Sum -EA 1^).Sum/1MB^)
') Do Set "FolderSize=%%S"

If %FolderSize% gtr %_UpperB% (
  Echo Size %FolderSize% of %Folder% is greater than upper bound %_UpperB%
  Exit /B 2
) else ( 
  If %FolderSize% lss %_LowerB% (
    Echo Size %FolderSize% of %Folder% is less than lower bound %_LowerB%
    Exit /b 1
  ) 
)
Echo Size %FolderSize% of %Folder% is within lower bound %_LowerB% and upper bound %_UpperB%

样本输出:

> SO_50247759.cmd
Size 173 of C:\Test is less than lower bound 194560

推荐阅读