如何使用PowerShell获取创建时间超过5天的卷影副本
问题:如何使用PowerShell获取创建时间超过5天的卷影副本?
用户提供了通过diskshadow工具查看卷影副本的输出示例:
cmd> Diskshadow Diskshadow> List shadows all * Shadow copy ID = {49fb469b-4940-45f7-98bd-08441e9e353c} <No Alias> - 卷影副本集: {32224b82-e802-4eab-a903-fb5dc6558800} <No Alias> - 原始卷影副本数量 = 11 - 原始卷名称: \\?\Volume{bba82744-b690-4b68-9180-c0d817c5a38f}\ [G:\] - 创建时间: 2021年4月13日 下午6:03:34 - 卷影副本设备名称: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy313 - 源计算机: app.contoso.local - 服务计算机: app.contoso.local - 未暴露 - 提供程序ID: {b5946137-7b9f-4925-af80-51abd60b20d5} - 属性: No_Auto_Release Persistent Differential * Shadow copy ID = {8ac42987-5f9a-4535-aef0-c6d64d7a658b} * Shadow copy ID = {d9be01ee-c1e6-424f-ac9a-cf82ef4e5e58} <No Alias> - 卷影副本集: {32224b82-e802-4eab-a903-fb5dc6558800} <No Alias> - 原始卷影副本数量 = 11 - 原始卷名称: \\?\Volume{1120d149-97e5-4b8d-af19-bb24338626ef}\ [H:\] - 创建时间: 2021年4月13日 下午6:03:34 - 卷影副本设备名称: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy271 - 源计算机: app.contoso.local - 服务计算机: app.contoso.local - 未暴露 - 提供程序ID: {b5946137-7b9f-4925-af80-51abd60b20d5} - 属性: No_Auto_Release Persistent Differential
解决方案
方法1:使用PowerShell原生CIM查询(推荐)
直接解析diskshadow的文本输出容易受语言环境、格式变化影响,而Windows的WMI类Win32_ShadowCopy提供了结构化的卷影副本数据,处理起来更可靠。
以下脚本会筛选出创建时间早于5天前的卷影副本:
# 计算5天前的时间节点 $cutoffDate = (Get-Date).AddDays(-5) # 查询所有卷影副本,筛选出符合时间条件的,并展示关键信息 Get-CimInstance -ClassName Win32_ShadowCopy | Where-Object { $_.InstallDate -lt $cutoffDate } | Select-Object ID, VolumeName, InstallDate, DeviceObject
说明:
Win32_ShadowCopy包含了卷影副本的所有核心属性,比如ID(副本ID)、VolumeName(原始卷路径)、InstallDate(创建时间)、DeviceObject(卷影设备路径)- 你可以根据需要调整
Select-Object后的字段,添加更多属性比如Caption、Description等
方法2:解析diskshadow的文本输出(适合特定场景)
如果因为某些限制必须使用diskshadow的输出,我们可以通过正则表达式解析文本并筛选:
# 执行diskshadow命令并捕获输出 $shadowOutput = diskshadow /s <(echo "list shadows all") # 初始化变量存储解析后的卷影副本信息 $shadows = @() $currentShadow = $null # 逐行解析输出 foreach ($line in $shadowOutput) { # 匹配新的卷影副本ID if ($line -match 'Shadow copy ID = ({[^}]+})') { # 保存上一个副本的信息(如果存在) if ($currentShadow) { $shadows += $currentShadow } # 初始化新的副本对象 $currentShadow = [PSCustomObject]@{ ID = $matches[1] VolumeName = $null CreationTime = $null } } # 匹配原始卷名称(提取盘符部分) elseif ($currentShadow -and $line -match '原始卷名称: .*\[([A-Z]:\\)\]') { $currentShadow.VolumeName = $matches[1] } # 匹配创建时间并转换为DateTime对象 elseif ($currentShadow -and $line -match '创建时间: (.+)') { $currentShadow.CreationTime = [DateTime]::Parse($matches[1]) } } # 添加最后一个卷影副本的信息 if ($currentShadow) { $shadows += $currentShadow } # 筛选创建时间超过5天的副本 $cutoffDate = (Get-Date).AddDays(-5) $oldShadows = $shadows | Where-Object { $_.CreationTime -lt $cutoffDate } # 输出结果 $oldShadows
注意:
- 这个脚本是针对中文环境的
diskshadow输出写的,如果你的系统是英文环境,需要把正则里的中文关键词(比如“原始卷名称”、“创建时间”)换成对应的英文("Original Volume Name"、"Creation Time") - 文本解析的稳定性不如WMI/CIM查询,优先推荐方法1
内容的提问来源于stack exchange,提问作者Arbelac




