PowerShell通过变量存储的结果循环实现批量vhdx文件优化的开发问题
PowerShell VHDX批量优化脚本实现
以下是补全所有需求逻辑后的完整可运行脚本:
<# 脚本欢迎提示 #> Write-Host "本脚本将自动批量优化指定目录下的RDS VHDX文件,释放冗余占用空间,请按照提示完成操作。" -ForegroundColor Green <# 提示用户输入VHDX文件存储目录 #> [string]$pathname = Read-Host -Prompt '请输入VHDX文件所在的完整目录路径' <# 提示用户正在扫描 #> Write-Host "正在从 $pathname 路径下扫描VHDX文件..." <# 扫描指定路径下所有VHDX文件,排除UVHD模板文件 #> $filesFound = Get-ChildItem -Path $pathname -Recurse -Include *.vhdx -Exclude UVHD-template* <# 输出扫描到的文件列表供用户确认 #> Write-Host "`n扫描到以下VHDX文件:" $filesFound | Select-Object FullName, @{Name="文件大小(GB)";Expression={[math]::Round($_.Length/1GB,2)}} | Format-Table -AutoSize Read-Host "请确认上方文件列表无误,按任意键继续执行优化" -ForegroundColor Green <# 定义检测文件是否被锁定的函数 #> function Test-FileLocked { param([Parameter(Mandatory=$true)][string]$FilePath) try { $fileStream = [System.IO.File]::Open($FilePath, 'Open', 'Write', 'None') if ($fileStream) { $fileStream.Close() } return $false } catch [System.IO.IOException] { return $true } } <# 初始化跳过文件计数 #> [int]$skipCount = 0 <# 遍历所有扫描到的VHDX文件 #> foreach ($file in $filesFound) { Write-Host "`n正在处理文件:$($file.FullName)" # 检测文件是否被锁定 if (Test-FileLocked -FilePath $file.FullName) { Write-Host "文件已被其他进程锁定,跳过当前文件" -ForegroundColor Yellow $skipCount++ continue } # 执行VHDX优化操作 try { Optimize-VHD -Path $file.FullName -Mode Full Write-Host "文件优化完成" -ForegroundColor Green } catch { Write-Host "文件优化失败:$_" -ForegroundColor Red $skipCount++ } } <# 执行完成后输出统计结果 #> Write-Host "`n==================== 执行完成 ====================" -ForegroundColor Green Write-Host "本次共处理VHDX文件:$($filesFound.Count) 个" Write-Host "其中跳过的文件总数:$skipCount 个"
关键说明
- 脚本必须以管理员身份运行,否则
Optimize-VHD系统命令会无执行权限 - 如果需要加快优化速度,可以将
Optimize-VHD的-Mode Full参数替换为-Mode Quick,仅执行快速空间回收 - 如果不需要递归扫描子目录下的VHDX文件,删除
Get-ChildItem中的-Recurse参数即可
内容的提问来源于stack exchange,提问作者Brad Imsicke
相关产品推荐
相关产品推荐

