我一直在考虑从我们的服务器上定期提取一些数据。我做了一些研究,并找出哪个服务器在哪个磁盘上运行VSS,我发现这很有挑战性-或者只是没有找到正确的命令。
我得到的关闭是这样的:vssadmin列表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
都在字符串数组中,所以我可以使用它
如果有人能给这个黑暗的话题带来一些启示,我将不胜感激。
vssadmin
是一个命令行工具,而不是PowerShell命令行。它生成字符串输出,因此如果您想将字符串转换为对象,则需要从字符串中解析信息。
$pattern = 'for volume: ((.*?))[sS]*?' +
'used.*?space: (d+.*?b)[sS]*?' +
'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): $_" }
}