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): $_" }
}