vssadmin和powershell对象到数组

时间:2016-10-13 15:20:13

标签: powershell object shadow-copy

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

我得到的关闭是:vssadmin list shadowstorage但它是一个我无法弄清楚的powershell对象。 WI得到了我需要搜索字符串的结果,例如'(D :)和#39;得到那条线。

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

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

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

如果有人可以对这个黑暗主题有所了解,我将非常感激。

2 个答案:

答案 0 :(得分: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): $_" }
}

答案 1 :(得分: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_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
                }}