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

使用PowerCLI整合30天前VMware快照的脚本问题求助

解决PowerCLI快照整合与删除的两个问题

我来帮你搞定这两个PowerCLI脚本的小问题,咱们一步步来:

一、修复VM磁盘整合脚本

你原来的脚本问题出在select VM返回的是带有VM属性的自定义对象,而不是直接的VM对象,所以没法直接调用ExtensionData.ConsolidateVMDisks()。另外还要注意避免重复处理同一个VM(比如一个VM有多个超过30天的快照),优化后的脚本如下:

Connect-VIServer -Server ServerName01

# 筛选出所有带30天以上快照的VM,并且去重避免重复处理
$vmsToConsolidate = Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-30)} | Select-Object -ExpandProperty VM -Unique

# 逐个执行磁盘整合操作
foreach ($vm in $vmsToConsolidate) {
    Write-Host "正在整合VM [$($vm.Name)] 的磁盘..."
    $vm.ExtensionData.ConsolidateVMDisks()
}

关键优化点:

  • 用Select-Object -ExpandProperty VM -Unique直接提取VM对象并去重,确保每个VM只被处理一次
  • 加入Write-Host提示,方便你跟踪执行进度

二、让删除快照的确认窗口显示VM和快照名称

默认的Remove-Snapshot确认提示信息不够详细,咱们可以先收集所有待删除的快照,先展示详细信息,再让你确认是否执行删除(或者逐个确认):

方案1:批量确认后删除

先列出所有待删除的快照明细,再统一确认:

# 获取所有创建超过30天的快照
$snapshotsToRemove = Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-30)}

# 展示待删除快照的详细信息
Write-Host "=== 待删除快照列表 ==="
$snapshotsToRemove | Select-Object `
    @{Name='VM名称';Expression={$_.VM.Name}},
    @{Name='快照名称';Expression={$_.Name}},
    @{Name='创建时间';Expression={$_.Created.ToString('yyyy-MM-dd HH:mm')}} | 
    Format-Table -AutoSize

# 确认是否执行删除
$confirm = Read-Host "确认要删除以上所有快照吗?(Y/N)"
if ($confirm -match '^[Yy]$') {
    $snapshotsToRemove | Remove-Snapshot -Confirm:$false
    Write-Host "所有符合条件的快照已成功删除!"
} else {
    Write-Host "已取消删除操作。"
}

方案2:逐个快照确认删除

如果需要对每个快照单独确认,可以用循环处理:

$snapshotsToRemove = Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-30)}

foreach ($snap in $snapshotsToRemove) {
    $vmName = $snap.VM.Name
    $snapName = $snap.Name
    $createdDate = $snap.Created.ToString('yyyy-MM-dd HH:mm')
    
    $confirm = Read-Host "确认删除VM [$vmName] 的快照 [$snapName](创建于 $createdDate)吗?(Y/N)"
    if ($confirm -match '^[Yy]$') {
        $snap | Remove-Snapshot -Confirm:$false
        Write-Host "已删除VM [$vmName] 的快照 [$snapName]"
    } else {
        Write-Host "跳过VM [$vmName] 的快照 [$snapName]"
    }
}

这样你就能清楚看到每个待删除快照的VM名称、快照名称和创建时间,操作起来更放心。

内容的提问来源于stack exchange,提问作者David Folksman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:57:06