0

我一直在考虑定期从我们的服务器中提取一些数据。我进行了一些研究并找出哪个服务器在哪个磁盘上运行 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

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

如果有人可以为这个黑暗的话题带来一些启示,我将不胜感激。

4

2 回答 2

0

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): $_" }
}
于 2016-10-13T16:33:16.193 回答
0

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_ShadowStorageWMI 类。下一次运行时间可以从各自的计划任务中获取。

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
                }}
于 2016-10-13T17:48:19.797 回答