准备
需要有管理员权限,用管理员权限打开powershell,而后执行命令以允许执行脚本。
如果出于安全原因 PowerShell 默认不允许运行未签名的脚本,你可能需要先运行以下命令来允许执行本地脚本:
Set-ExecutionPolicy RemoteSigned
但是,请注意,RemoteSigned 策略允许你运行本地脚本和来自 Internet 的已签名脚本。
如果你只是想临时允许执行所有脚本(仅在当前 PowerShell 会话中),你可以使用:
Set-ExecutionPolicy Unrestricted -Scope Process
但是,请谨慎使用 Unrestricted 策略,因为它可能会带来安全风险。
脚本内容
写的比较简单,报错处理没弄,但能用就行,要改的看着改吧。
程序是一直让输入路径,即使路径错误,直到输入quit,才会退出程序,否则一直循环等待计算指定路径下目录大小。
function CalculateDirectorySizes {
param (
[Parameter(Mandatory=$true)]
[string]$RootPath
)
# 检查输入路径是否为空或无效
if ([string]::IsNullOrWhiteSpace($RootPath) -or !(Test-Path -Path $RootPath -PathType Container)) {
Write-Host "输入的路径无效或为空,请重新输入。"
return $null
}
# 使用哈希表来存储不同单位的大小及其对应的目录
$sizeData = [ordered]@{}
$sizeData['GB'] = @()
$sizeData['MB'] = @()
Get-ChildItem -Path $RootPath -Directory | ForEach-Object {
$size = (Get-ChildItem -Path $_.FullName -Recurse -File | Measure-Object -Sum Length).Sum
$sizeMB = $size / 1MB
$sizeGB = $size / 1GB
# 根据大小选择合适的单位并存储
if ($sizeGB -ge 1) {
$sizeData['GB'] += [pscustomobject]@{Path=$_.FullName; Size = $sizeGB }
} elseif ($sizeMB -ge 500) {
$sizeData['MB'] += [pscustomobject]@{Path=$_.FullName; Size = $sizeMB }
}
}
# 返回结果
return $sizeData
}
# 主循环
while ($true) {
# 提示用户输入目录路径或quit
$inputPath = Read-Host "请输入要检查大小的目录路径(输入'quit'退出)"
# 检查用户是否输入了'quit'
if ($inputPath.ToLower() -eq 'quit') {
Write-Host "退出程序。"
break
}
# 检查输入路径是否为空或仅包含空白字符
if ([string]::IsNullOrWhiteSpace($inputPath)) {
Write-Host "路径不能为空,请重新输入。"
continue
}
# 调用函数并处理结果
$sizeData = CalculateDirectorySizes -RootPath $inputPath
# 检查路径是否有效
if ($sizeData -eq $null) {
continue
}
# 分别按GB和MB单位的大小从大到小排序并输出
foreach ($unit in $sizeData.Keys) {
Write-Host "Size in $unit"
$sizeData[$unit] | Sort-Object -Property Size -Descending | ForEach-Object {
Write-Host "$($_.Path): $($_.Size.ToString("F2")) $unit"
}
if ($unit -ne $sizeData.Keys[-1]) {
Write-Host "" # 在GB和MB之间添加空行以分隔
}
}
Write-Host ""
}