You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell磁盘文件分配脚本优化:适配小磁盘剩余空间需求

调整PowerShell脚本实现磁盘空间分配以触发SNOW告警

需要在SNOW中配置磁盘使用率超过85%时的告警,经计算触发告警需占用总磁盘空间57GB。原脚本将57GB平分到除S盘(SWAP盘)外的磁盘,但部分磁盘剩余空间仅2-4GB,无法容纳平分后的文件大小,导致脚本执行失败。

以下是调整后的脚本,采用动态分配逻辑,确保每个目标磁盘仅分配其能容纳的空间,最终凑够57GB总占用量:

# 目标总占用空间(GB)
$targetTotalGB = 57
# 每个磁盘预留少量剩余空间(避免磁盘完全占满,可按需调整)
$reservePerDriveGB = 0.5

# 获取所有本地磁盘,排除S盘(SWAP盘)且剩余空间大于0的磁盘
$drives = Get-WmiObject Win32_LogicalDisk | Where-Object { 
    $_.DriveType -eq 3 -and $_.DeviceID -ne "S:" -and $_.FreeSpace -gt 0
}

# 转换磁盘剩余空间为GB,计算可分配最大空间,并按可分配空间从大到小排序
$drivesWithFreeSpace = $drives | ForEach-Object {
    [PSCustomObject]@{
        DeviceID = $_.DeviceID
        FreeGB = [math]::Round($_.FreeSpace / 1GB, 2)
        MaxAllocatableGB = [math]::Max($_.FreeSpace / 1GB - $reservePerDriveGB, 0)
    }
} | Sort-Object -Property MaxAllocatableGB -Descending

$totalAllocated = 0

if ($drivesWithFreeSpace.Count -gt 0) {
    foreach ($drive in $drivesWithFreeSpace) {
        # 已达到目标总占用量则停止分配
        if ($totalAllocated -ge $targetTotalGB) {
            break
        }

        # 计算当前磁盘可分配的空间:取最大可分配量与剩余需分配量的最小值
        $allocatable = [math]::Min($drive.MaxAllocatableGB, $targetTotalGB - $totalAllocated)
        
        if ($allocatable -le 0) {
            Write-Host "$($drive.DeviceID) 剩余空间不足,跳过"
            continue
        }

        $filePath = "$($drive.DeviceID)\TestFile.txt"
        # 转换为字节数(每个空格占1字节,用于生成对应大小的文件)
        $allocatableBytes = [math]::Round($allocatable * 1GB)
        
        # 创建指定大小的文件,覆盖已存在的同名文件
        try {
            $null = New-Item -Path $filePath -ItemType File -Value (" " * $allocatableBytes) -Force
            Write-Host "在$($drive.DeviceID)创建了$([math]::Round($allocatable,2)) GB的文件"
            $totalAllocated += $allocatable
        } catch {
            Write-Host "无法在$($drive.DeviceID)创建文件:$_"
        }
    }

    Write-Host "`n总已分配空间:$([math]::Round($totalAllocated,2)) GB,目标:$targetTotalGB GB"
    if ($totalAllocated -lt $targetTotalGB) {
        Write-Host "警告:所有可用磁盘剩余空间总和不足$targetTotalGB GB,无法达到目标占用量"
    }
} else {
    Write-Host "未找到符合条件的本地磁盘"
}

关键逻辑说明

  • 单位转换:将Win32_LogicalDisk返回的字节数转换为GB,简化空间计算
  • 磁盘排序:优先使用剩余空间多的磁盘,确保快速凑够目标总占用量
  • 动态分配:每个磁盘仅分配其能容纳的最大空间(预留少量空间避免磁盘完全占满),不会超出磁盘剩余容量
  • 异常处理:捕获文件创建时的错误,单个磁盘失败不会导致整个脚本终止
  • 状态反馈:实时输出分配进度,最后汇总结果,若无法达到目标则给出明确警告

内容的提问来源于stack exchange,提问作者snehasish nandy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:46:26