我正在尝试使用以下脚本完成上述操作:
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的名称和快照。
谢谢。
答案 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名称。如果该方法已提供所需的输出,请随时将其删除。