vssadmin и powershell объект для массива

Я думал о том, чтобы регулярно получать некоторые данные с наших серверов. Я провел несколько исследований и выяснил, на каком сервере работает VSS, на каком диске это было сложно - или просто не нашел нужную команду.

Закрытие, которое я получил, это: vssadmin list shadowstorage, но это объект PowerShell, который я не могу понять. Когда я получу результат, мне нужно найти строки типа '(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

Все в массиве строк, поэтому я могу играть с ним.

Если бы кто-то мог пролить свет на эту темную тему, я был бы очень признателен.

2 ответа

vssadmin является инструментом командной строки, а не командлетом PowerShell. Он генерирует вывод строки, поэтому вам нужно будет проанализировать информацию из строки, если вы хотите превратить ее в объект.

$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
                }}

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): $_" }
}
Другие вопросы по тегам