使用PowerCLI修改VMware快照描述不生效问题求助
解决PowerCLI修改vCenter快照描述不生效的问题
我看了你的脚本,发现几个关键问题导致快照描述修改没实际生效,咱们一步步来梳理和修正:
问题根源分析
VM属性的类型错误:你第一次获取快照时用了
select VM, Name, Description,这里的VM是完整的VM对象而非字符串名称。后续执行get-vm -name $($snap.vm)时,PowerShell会强制把对象转成字符串,虽然偶尔能匹配成功,但大概率会出现定位偏差,导致Get-Snapshot找不到目标快照,Set-Snapshot自然也就没作用。冗余的对象查询:你已经拿到了
$Snap快照对象,没必要再重新通过Get-VM+Get-Snapshot定位,直接用原对象操作更可靠,还能避免重复查询带来的错误。未抑制确认提示(隐性风险):
Set-Snapshot默认会弹出确认对话框,批量操作时可能因为这个环节导致部分修改被中断,加上-Confirm:$false能确保操作顺畅执行。
修正后的完整脚本
Get-Module -Name VMware* -ListAvailable | Import-Module $AllSnaps = @() $User = "Domain\UserName" $File = "Credentials.txt" $MyCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString) foreach ($VC in $VCServers) { $Stat = Connect-VIServer $VC -Credential $MyCredential -ErrorAction 'SilentlyContinue' if ($Stat.IsConnected) { Write-Host "Connected to VC - $VC" # 保留完整快照对象,无需提前筛选属性,方便后续直接操作 $AllSnaps = Get-VM | Get-Snapshot ForEach ($Snap in $AllSnaps) { # 跳过无需修改的快照 if ($Snap.Name -match "NBU_SNAPSHOT" -or $Snap.Description -match "PERM-") { Write-Host "No Action required for snapshot '$($Snap.Name)' on VM '$($Snap.VM.Name)'" } else { # 处理空描述场景,避免生成无意义的"PERM-"前缀 $NewDesc = if ([string]::IsNullOrEmpty($Snap.Description)) { "PERM-" } else { "PERM-" + $Snap.Description } Write-Host "Updating description for snapshot '$($Snap.Name)' on VM '$($Snap.VM.Name)' to: $NewDesc" # 直接用原快照对象执行修改,无需重复查询定位 $Snap | Set-Snapshot -Description $NewDesc -Confirm:$false } } Disconnect-VIServer -Server $VC -Force -Confirm:$False } }
额外优化说明
- 移除了
select VM, Name, Description,让$Snap保留完整的快照对象,通过管道直接传给Set-Snapshot能100%确保操作的是目标快照。 - 增加了空描述的处理逻辑,避免出现仅包含"PERM-"的无效描述(如果不需要可以直接删除这部分判断)。
- 优化了日志输出,让你能清晰看到每个被处理的快照信息,方便后续排查问题。
- 加上
-Confirm:$false,确保批量操作不会被确认提示中断。
你可以先在测试环境里跑这个修正后的脚本,要是还存在问题,可以检查一下vCenter账号是否拥有修改快照属性的权限,或者快照是否正被其他工具锁定(比如备份任务执行中)。
内容的提问来源于stack exchange,提问作者rpr
相关产品推荐
相关产品推荐

