Я новичок в Powershell и пытаюсь написать скрипт Powershell, который я могу использовать для отслеживания статуса VSS на наших серверах с помощью инструмента RMM. На данный момент у меня есть:
# List all Volumes
$Volumes = gwmi Win32_Volume -Property SystemName,DriveLetter,DeviceID,Capacity,FreeSpace -Filter "DriveType=3" |
Select SystemName,@{n="DriveLetter";e={$_.DriveLetter.ToUpper()}},DeviceID,@{n="CapacityGB";e={([math]::Round([int64]($_.Capacity)/1GB,2))}},@{n="FreeSpaceGB";e={([math]::Round([int64]($_.FreeSpace)/1GB,2))}} | Sort DriveLetter
# get all shadow storage volumes
$ShadowStorage = gwmi Win32_ShadowStorage -Property AllocatedSpace,DiffVolume,MaxSpace,UsedSpace,Volume |
Select @{n="Volume";e={$_.Volume.Replace("\\","\").Replace("Win32_Volume.DeviceID=","").Replace("`"","")}},
@{n="DiffVolume";e={$_.DiffVolume.Replace("\\","\").Replace("Win32_Volume.DeviceID=","").Replace("`"","")}},
@{n="AllocatedSpaceGB";e={([math]::Round([int64]($_.AllocatedSpace)/1GB,2))}},
@{n="MaxSpaceGB";e={([math]::Round([int64]($_.MaxSpace)/1GB,2))}},
@{n="UsedSpaceGB";e={([math]::Round([int64]($_.UsedSpace)/1GB,2))}}
# list all shadow coppies
$ShadowCopies = gwmi Win32_ShadowCopy -Property VolumeName,InstallDate,Count |
Select VolumeName,InstallDate,Count,
@{n="CreationDate";e={$_.ConvertToDateTime($_.InstallDate)}}
# format and output stats
$Shares = gwmi win32_share -Property Name,Path | Select Name,@{n="Path";e={$_.Path.ToUpper()}}
If($Volumes)
{
$Output = @()
ForEach($Volume in $Volumes)
{
$VolumeShares = $VolumeShadowStorage = $DiffVolume = $VolumeShadowCopies = $Null
If($Volume.DriveLetter -ne $Null){[array]$VolumeShares = $Shares | ?{$_.Path.StartsWith($Volume.DriveLetter)}}
$VolumeShadowStorage = $ShadowStorage | ?{$_.Volume -eq $Volume.DeviceID}
If($VolumeShadowStorage){$DiffVolume = $Volumes | ?{$_.DeviceID -eq $VolumeShadowStorage.DiffVolume}}
$VolumeShadowCopies = $ShadowCopies | ?{$_.VolumeName -eq $Volume.DeviceID} | Sort InstallDate
$Object = New-Object psobject
$Object | Add-Member NoteProperty SystemName $Volume.SystemName -PassThru | Add-Member NoteProperty DriveLetter $Volume.DriveLetter -PassThru |
Add-Member NoteProperty CapacityGB $Volume.CapacityGB -PassThru | Add-Member NoteProperty FreeSpaceGB $Volume.FreeSpaceGB -PassThru |
Add-Member NoteProperty ShareCount "" -PassThru | Add-Member NoteProperty Shares "" -PassThru |
Add-Member NoteProperty ShadowAllocatedSpaceGB "" -PassThru | Add-Member NoteProperty ShadowUsedSpaceGB "" -PassThru |
Add-Member NoteProperty ShadowMaxSpaceGB "" -PassThru | Add-Member NoteProperty DiffVolumeDriveLetter "" -PassThru |
Add-Member NoteProperty DiffVolumeCapacityGB "" -PassThru | Add-Member NoteProperty DiffVolumeFreeSpaceGB "" -PassThru |
Add-Member NoteProperty ShadowCopyCount "" -PassThru | Add-Member NoteProperty OldestShadowCopy "" -PassThru |
Add-Member NoteProperty LatestShadowCopy "" -PassThru | Add-Member NoteProperty ShadowAverageSizeGB "" -PassThru | Add-Member NoteProperty ShadowAverageSizeMB ""
If($VolumeShares)
{ $Object.ShareCount = $VolumeShares.Count
If($VolumeShares.Count -eq 1){$Object.Shares = $VolumeShares[0].Name}
Else{$Object.Shares = [string]::join(", ", ($VolumeShares | Select Name)).Replace("@{Name=", "").Replace("}", "")}
}
If($VolumeShadowStorage)
{ $Object.ShadowAllocatedSpaceGB = $VolumeShadowStorage.AllocatedSpaceGB
$Object.ShadowUsedSpaceGB = $VolumeShadowStorage.UsedSpaceGB
$Object.ShadowMaxSpaceGB = $VolumeShadowStorage.MaxSpaceGB
If($DiffVolume)
{ $Object.DiffVolumeDriveLetter = $DiffVolume.DriveLetter
$Object.DiffVolumeCapacityGB = $DiffVolume.CapacityGB
$Object.DiffVolumeFreeSpaceGB = $DiffVolume.FreeSpaceGB
}
}
If($VolumeShadowCopies)
{ $Object.ShadowCopyCount = (($VolumeShadowCopies | Measure-Object -Property Count -Sum).Sum)
$Object.OldestShadowCopy = (($VolumeShadowCopies | Select -First 1).CreationDate)
$Object.LatestShadowCopy = (($VolumeShadowCopies | Select -Last 1).CreationDate)
If($VolumeShadowStorage.UsedSpaceGB -gt 0 -And $Object.ShadowCopyCount -gt 0)
{ $Object.ShadowAverageSizeGB = ([math]::Round($VolumeShadowStorage.UsedSpaceGB/$Object.ShadowCopyCount,2))
$Object.ShadowAverageSizeMB = ([math]::Round(($VolumeShadowStorage.UsedSpaceGB*1KB)/$Object.ShadowCopyCount,2))
}
}
}
If($VolumeShadowStorage -Or $ShowAllVolumes){$Output += $Object}
}
$Output
Это выведет такой блок информации:
SystemName : server
DriveLetter : F:
CapacityGB : 1850
FreeSpaceGB : 676.75
ShareCount : 17
Shares : List of shares
ShadowAllocatedSpaceGB : 71.41
ShadowUsedSpaceGB : 62.3
ShadowMaxSpaceGB : 292.97
DiffVolumeDriveLetter : F:
DiffVolumeCapacityGB : 1850
DiffVolumeFreeSpaceGB : 676.75
ShadowCopyCount : 961
OldestShadowCopy : 4/25/2020 8:39:29 AM
LatestShadowCopy : 7/8/2020 9:17:56 AM
ShadowAverageSizeGB : 0.06
ShadowAverageSizeMB : 66.38
Что мне нужно сделать, чтобы это работало с нашими инструментами RMM, является break каждую строку этого вывода в свои переменные, чтобы инструмент RMM мог прочитать каждую из них. Для контекста это тот скрипт, который мы используем сейчас, он работает, но на самом деле выводит только основы: быть под контролем. Вот как это выглядит Это затем читается нашим инструментом RMM вот так Надеюсь, кто-нибудь может указать мне правильное направление для решения этой проблемы. Прошу прощения, если это слишком много вопрос.