You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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后的字段,添加更多属性比如CaptionDescription

方法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

火山引擎 最新活动