在Powershell中整合早于30天的VMWare快照

时间:2019-07-09 14:52:18

标签: powershell powercli

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

Connect-VIServer -Server ServerName01

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

我对PowerCLI还是很陌生,这是迄今为止最好的ive。

在看到变量$ VMName的内容之前,我不希望运行此命令,因此我运行了以下命令。

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

哪个会返回满足上述条件的VMName列表(手动检查确认)

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

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

可以工作,但是我想在确认窗口中看到VM的名称和快照。

谢谢。

1 个答案:

答案 0 :(得分:1)

以下内容将使您可以为每个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名称。如果该方法已提供所需的输出,请随时将其删除。