我一直在考虑从我们的服务器定期提取一些数据。我已经做了一些研究,并找出哪个服务器在我发现它具有挑战性的磁盘上运行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
全部在字符串数组中,所以我可以使用它。
如果有人可以对这个黑暗主题有所了解,我将非常感激。
答案 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
}}