在 powershell 中整合 30 天前的 VMWare 快照

Consolidate VMWare snapshots older then 30 days in powershell

我正在尝试使用以下脚本完成上述操作:

Connect-VIServer -Server ServerName01

$VMName = Get-VM | Get-Snapshot | 
    Where {$_.Created -lt (Get-Date).AddDays(-30)} | select VM |
        ForEach-Object {
            $VMName.ExtensionData.ConsolidateVMDisks()
        }

我是 PowerCLI 的新手,这是我迄今为止想出的最好的。

我不想 运行 这个命令,直到我可以看到变量 $VMName 的内容,所以我 运行 下面的命令。

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

哪个return符合上述条件的VMName列表(人工检查确认)

初始代码不起作用,它根本没有将 $VMName 变量中的任何内容传递给 ExtensionData.ConsolidateVMDisks()

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

有效,但我希望在确认中看到虚拟机的名称和快照 window。

谢谢。

以下将允许您为每个 VM 执行 ConsolidateVMDisks() 方法。

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

$VMName | Foreach-Object {
    $_.VM.Name
    $_.VM.ExtensionData.ConsolidateVMDisks()
}

以下将使用Remove-Snapshot命令满足您的要求:

$Snapshots = Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-30)}
$Snapshots | Foreach-Object {
    "VM Name: {0}" -f $_.VM.Name
    "Snapshot Name: {0}" -f $_.Name
    $_ | Remove-Snapshot
}

在您最初的尝试中,$VMName 包含一组 VM 对象。当您将数组通过管道传输到 Foreach-Object 脚本块时,当前对象变为 $_$PSItem。当前对象是您必须访问 属性 和相应方法的地方。我添加了 $_.Name 代码以在合并发生之前将当前 VM 名称显示到控制台。如果该方法已经提供了您需要的输出,请随意删除它。