【问题标题】:vssadmin and powershell object to arrayvssadmin 和 powershell 对象到数组
【发布时间】:2017-02-22 19:30:26
【问题描述】:

我一直在考虑定期从我们的服务器中提取一些数据。我进行了一些研究并找出哪个服务器在哪个磁盘上运行 VSS,我发现它具有挑战性 - 或者只是没有找到正确的命令。

我得到的关闭是这样的:vssadmin list shadowstorage 但它是一个我无法弄清楚的 powershell 对象。 WI得到我需要搜索'(D:)'之类的字符串并获取该行的结果。

我想选择数组格式的驱动器和空间信息。

Shadow Copy Storage association
   For volume: (G:)\\?\Volume{68cefbec-f673-467d-95ac-7e442df77cdb}\
   Shadow Copy Storage volume: (G:)\\?\Volume{68cefbec-f673-467d-95ac-7e442df77cdb}\
   Used Shadow Copy Storage space: 2.91 GB (0%)
   Allocated Shadow Copy Storage space: 5.80 GB (0%)
   Maximum Shadow Copy Storage space: 400 GB (19%)

编辑: 我想把这些数据拿出来:

Computername: xxxxxxxsvr01 
Drive (where VSS running on the drive): G:
Allocated Shadows Storage space: 5.80GB
Next run date: which I have no clue how to get it yet

全部在一个字符串数组中,所以我可以使用它。

如果有人能对这个黑暗的话题有所启发,我将不胜感激。

【问题讨论】:

标签: powershell object shadow-copy


【解决方案1】:

vssadmin 不返回 PowerShell 对象,它只是将文本打印到标准输出。你得到的是一个数组,其中每一行文本都是一个项目。如果您想逐行处理输出,这很方便。

您需要解析文本以获得所需的值。

例子:

switch -Regex (vssadmin list shadowstorage | ? { $_ -like '   *' }) {

    'For volume: \((.+)\)' { "Volume $($Matches[1])" }

    'Shadow Copy Storage volume:' { }

    'Used Shadow Copy Storage space: ([\d|.]+) GB' { "Used: $($Matches[1]) GB" }

    'Allocated Shadow Copy Storage space: ([\d|.]+) GB' { "Allocated: $($Matches[1]) GB" }

    'Maximum Shadow Copy Storage space: ([\d|.]+) GB' { "Maximum: $($Matches[1]) GB" }

    default { "This line is not recognized yet (add a rule): $_" }
}

【讨论】:

    【解决方案2】:

    vssadmin 是命令行工具,而不是 PowerShell cmdlet。它会生成字符串输出,因此如果要将字符串转换为对象,则需要解析字符串中的信息。

    $pattern = 'for volume: \((.*?)\)[\s\S]*?' +
               'used.*?space: (\d+.*?b)[\s\S]*?' +
               'allocated.*?space: (\d.*?b)'
    
    & vssadmin list shadowstorage | Out-String |
      Select-String $pattern -AllMatches |
      Select-Object -Expand Matches |
      ForEach-Object {
        New-Object -Type PSObject -Property @{
          ComputerName   = $env:COMPUTERNAME
          Drive          = $_.Groups[1].Value
          UsedSpace      = $_.Groups[2].Value
          AllocatedSpace = $_.Groups[3].Value
        }
      }
    

    更好的方法可能是查询Win32_ShadowStorage WMI 类。下次运行时间可以从各自的定时任务中获取。

    Get-WmiObject -Class Win32_ShadowStorage |
      Select-Object PSComputername, @{n='Drive';e={([wmi]$_.Volume).DriveLetter}},
                    AllocatedSpace, UsedSpace,
                    @{n='NextRunTime';e={
                      $volume = ([wmi]$_.Volume).DeviceId -replace '[\\?]'
                      (Get-ScheduledTaskInfo "ShadowCopy$volume").NextRunTime
                    }}
    

    【讨论】:

    • 非常感谢您提供的详细信息。我会尽快检查并回复您。非常感谢您的时间和意愿。
    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    相关资源
    最近更新 更多