我是PowerShell/PowerCli Newbie,现在我正在学习工作。我已经创建了一个简单的几行代码来列出所有快照,并使用out-gridview将其列出在另一个弹出窗口中,选择一个或多个快照,然后单击"确定",让我删除选定的快照,并且它可以毫无问题地工作。。
#List snapshot
$snapshot = Get-VM | Get-Snapshot | Out-GridView -Title "Snapshot Viewer" -OutputMode Multiple
#remove selected VM's snapshot
$snapshot | foreach { Remove-Snapshot $_ }
因为默认Get-Snapshot
仅显示快照名称,描述和Powerstate,所以我添加了一个计数器,VM名称,GB中的快照大小和快照年龄。
$counter = 1
#List snapshot with more information
$snapshot = Get-VM | Get-Snapshot |
Select-Object @{Name="ID";Expression={$global:counter;$global:counter++}},
VM, Name, @{Name="SizeGB";Expression={[math]::Round($_.sizeGB,2)}},
@{Name="Days";Expression={(New-TimeSpan -End (Get-Date) -Start $_.Created).Days}} |
Out-GridView -Title "Snapshot Viewer" -OutputMode Multiple
#remove selected VM's snapshot
$snapshot | foreach { Remove-Snapshot $_ }
现在$_
似乎返回了Remove-Snapshot
的错误参数并获得错误:
删除snapshot:无法绑定参数"快照"。无法转换"@{id = 4; vm = win7-golden; name = ss20170227 v3.1; sizegb = 0.00; days = 64}类型为" Selected.VMware.vimautomation.vicore.impl.impl.v1.vm.snapshotimpl"的值要键入" vmware.vimautomation.vicore.types.v1.vm.snapshot"。在D: powershell snapshot_with_index.ps1:10 char:39 $快照|foreach {remove-snapshot $ _} ~~ categoryInfo:invalidargument :( :) [remove-snapshot],parameterBindingException flutlqualifyErrid:consevertargumentNomessage,vmware.vimautomation.vicore.cmdlets.commands.removesnapshot
感谢任何人可以为我提供有关如何解决此错误的指导,以传递正确的参数。
Select-Object
将对象类型更改为 PSCustomObject
,但是 Remove-Snapshot
似乎期望快照对象。
我无法访问vSphere系统,但是如果要允许使用"增强信息"的GridView进行过滤,则可能首先将快照存储在数组中,然后从该数组中获取所选快照用于删除。
这样的事情可能有效:
$snapshots = @(Get-VM | Get-Snapshot)
0..($snapshots.Count - 1) | ForEach-Object {
$i = $_
$snapshots[$i] | Select-Object @{n='ID';e={$i}}, ...
} | Out-GridView -Title "Snapshot Viewer" -OutputMode Multiple | ForEach-Object {
Remove-Snapshot $snapshots[$_.ID]
}