Got a legacy script, which collects info on all locally attached Volumes, only it fails on some of my computers (eg. one is a Windows 2008R2 w/PS 3.0)
I've identified that 'get-command get-partition' seems to be the culprit in this script and returns False on some computers.
Any hints are appreciated, TIA!
#Get Diskspace for all volumes (mapped to drives and folders)# calculations for displaying disk size information
$VolumeObject = new-object pSObject
$VolumeObjectArray = @()
$volumes = Get-WmiObject win32_volume | Where-Object {$_.Label -ne "Witness" -and $_.Label -ne "System Reserved" -and $_.Capacity -and $_.Capacity -gt '0'}
foreach ($vols in $volumes)
{
$VolumeObject = new-object pSObject
Add-Member -InputObject $VolumeObject -MemberType NoteProperty -Name "DeviceID" -Value $vols.DeviceID
Add-Member -InputObject $VolumeObject -MemberType NoteProperty -Name "Name" -Value $vols.Name
Add-Member -InputObject $VolumeObject -MemberType NoteProperty -Name "Label" -Value $vols.Label
$VolsCapacity = [math]::round(($vols.Capacity/ 1GB),2)
Add-Member -InputObject $VolumeObject -MemberType NoteProperty -Name "Capacity" -Value $VolsCapacity
$VolsFreeSpace = [math]::Round(($vols.freeSpace) / 1GB,2)
Add-Member -InputObject $VolumeObject -MemberType NoteProperty -Name "Free Space" -Value $VolsFreeSpace
$VolsFreeSpacePercentage = [math]::round(((($vols.FreeSpace / 1GB)/($vols.Capacity / 1073741824)) * 100),0)
Add-Member -InputObject $VolumeObject -MemberType NoteProperty -Name "Free Space Percentage" -Value $VolsFreeSpacePercentage
$VolumeObjectArray+= $VolumeObject
$volumeInfo = $volumeInfo + "DeviceID: " + $vols.deviceID + "| Name: " + $vols.Name + ";`r`n"
$volumeInfo = $volumeInfo + "DeviceID: " + $vols.deviceID + "| Label: " + $vols.Label + ";`r`n"
$volumeInfo = $volumeInfo + "DeviceID: " + $vols.deviceID + "| Capacity: " + [math]::round(($vols.Capacity/ 1GB),2) + ";`r`n"
$volumeInfo = $volumeInfo + "DeviceID: " + $vols.deviceID + "| Free Space: " + [math]::Round(($vols.freeSpace) / 1GB,2) + ";`r`n"
$volumeInfo = $volumeInfo + "DeviceID: " + $vols.deviceID + "| Free Space Percentage: " + [math]::round(((($vols.FreeSpace / 1GB)/($vols.Capacity / 1073741824)) * 100),0) + ";`r`n"
}
#Get diskspace with UID
#with Powershell commands(win 2012+)
if (get-command get-partition -ErrorAction silentlycontinue) {
$parts = get-partition
$PartArray = @()
$parts | ForEach-Object {
foreach ($path in $_.accesspaths){
if($path -match '(.*)Volume{.*}(.*)') {
$PartObj = new-object pSObject
$disks = get-disk -Number $_.DiskNumber
$volume = get-volume -Path $path
if ($Volume.Size -gt '0'){
Add-Member -InputObject $PartObj -MemberType NoteProperty -Name "DiskNumber" -Value $_.DiskNumber
Add-Member -InputObject $PartObj -MemberType NoteProperty -Name "AccessPath" -Value $path
Add-Member -InputObject $PartObj -MemberType NoteProperty -Name "DriveLetter" -Value $Volume.DriveLetter
Add-Member -InputObject $PartObj -MemberType NoteProperty -Name "Label" -Value $Volume.FileSystemLabel
Add-Member -InputObject $PartObj -MemberType NoteProperty -Name "Size" -Value $Volume.Size
Add-Member -InputObject $PartObj -MemberType NoteProperty -Name "SizeRemaining" -Value $Volume.SizeRemaining
Add-Member -InputObject $PartObj -MemberType NoteProperty -Name "UID" -Value $disks.UniqueID
[array]$PartArray += $partobj
foreach ($volarrayobj in $volumeobjectarray)
{if ($Volarrayobj.deviceid -eq $path ) {
Add-Member -InputObject $Volarrayobj -MemberType NoteProperty -Name "UID" -Value $disks.UniqueID
Add-Member -InputObject $Volarrayobj -MemberType NoteProperty -Name "DiskNumber" -Value $_.DiskNumber}}
}
}
}
}
#$partarray
foreach ($parts in $partarray)
{
$volumeInfo = $volumeInfo + "DeviceID: " + $parts.AccessPath + "| Disk UID : " + $parts.UID + ";`r`n"
$volumeInfo = $volumeInfo + "DeviceID: " + $parts.AccessPath + "| Disk Number : " + $parts.DiskNumber + ";`r`n"
#$PartitionInfo = $PartitionInfo + "DeviceID: " + $vols.deviceID + "| Name: " + $vols.Name + ";`r`n"
#$PartitionInfo = $PartitionInfo + "DeviceID: " + $vols.deviceID + "| Label: " + $vols.Label + ";`r`n"
#$PartitionInfo = $PartitionInfo + "DeviceID: " + $vols.deviceID + "| Capacity: " + [math]::round(($vols.Capacity/ 1GB),2) + ";`r`n"
#$PartitionInfo = $PartitionInfo + "DeviceID: " + $vols.deviceID + "| Free Space: " + [math]::Round(($vols.freeSpace) / 1GB,2) + ";`r`n"
#$PartitionInfo = $PartitionInfo + "DeviceID: " + $vols.deviceID + "| Free Space Percentage: " + [math]::round(((($vols.FreeSpace / 1GB)/($vols.Capacity / 1073741824)) * 100),0) + ";`r`n"
}
}
Else
{
$dpscript = @"
list volume
"@
$Vols = $()
[array]$Temp = $dpscript | diskpart
ForEach ($Line in $Temp)
{
If ($Line -match '\s{0,2}Volume\s\d')
{
[array]$Vols += $Line
}
ElseIf ($Line.StartsWith(" Disk"))
{
[array]$Disks += $Line
}
ElseIf ($Line.StartsWith(" VDisk"))
{
[array]$VDisks += $Line
}
}
$mpcount = if ((gwmi win32_diskpartition | where {$_.Index -eq 0}).count -eq $null) {1} else {(gwmi win32_diskpartition | where {$_.Index -eq 0}).count }
#$VolumeToDisk = @(0..($mpcount-1)) = -1
$VolumeToDisk = @(-1)* $mpcount
$VolDiskObj = New-Object PSObject
for ($i = 0; $i -lt $mpcount; $i++)
{
$VolDiskObj = New-Object PSObject
$dpscript = @"
select disk $i
detail disk
"@
[array]$TempDP = $dpscript | diskpart
if ($tempdp[-3] -match '\s{4,4}\w:\\(.*)')
{$pathMatch = $matches[0].trim()
#write-host "path Patch: " $pathMatch
$TempDP[-4] -match '\s{0,2}Volume\s(?<VolNr>...)(.*)' | out-null
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "DiskNr" -Value $i
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolNr" -Value $matches['VolNr'].trim()
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolPath" -Value $pathMatch
#$VolumeToDisk[$matches['VolNr'].trim()] = ($i,$pathMatch)
}
elseif ($TempDP[-3] -match '\s{0,2}Volume\s(?<VolNr>...)(.*)')
{
#$VolumeObjectInput = $VolumeObjectArray | where {$_.de
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "DiskNr" -Value $i
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolNr" -Value $matches['VolNr'].trim()
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolPath" -Value "None"
#$TempDP[27] -match '\s{0,2}Volume\s(?<VolNr>...)(.*)' | out-null
#$TempDP[-3] -match '\s{0,2}Volume\s(?<VolNr>...)(.*)' | out-null
}
Elseif ($TempDP[-2] -match 'DiskPart has encountered an error: The service cannot be started')
{#write-host "No DISKPART available"
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "DiskNr" -Value $i
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolNr" -value "None"#-Value $matches['VolNr'].trim()
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolPath" -Value "None"
}
Elseif ($TempDP[-3] -match 'DETAIL DISK')
{#write-host "No DISKPART available"
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "DiskNr" -Value $i
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolNr" -value "None"#-Value $matches['VolNr'].trim()
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolPath" -Value "None"
}
Else
{
$mpcount++
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "DiskNr" -Value $i
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolNr" -value "None"#-Value $matches['VolNr'].trim()
Add-Member -InputObject $VolDiskObj -MemberType NoteProperty -Name "VolPath" -Value "None"
#if ($matches) {
#write-host "Volume found for disk " $i " : " $matches['VolNr'].trim()
#$VolumeToDisk[$matches['VolNr'].trim()] = $i
clear-variable matches
}
[array]$VolDiskResults += $VolDIskObj
}
$sdd = get-content C:\windows\sddoutput.txt
if (!($sdd)) {$nosddfile = 1} else {$nosddfile = 0}
$diskuid = @{}
For ($i=1;$i -le ($sdd.count);$i++)
{
$sddmatch = $sdd[$i] -match '(.*)DEV#:\s{1,2}(.*)\s{2,2}DEVICE\sNAME: Disk(?<disknr>..)(.*)'
if ($sddmatch)
{$DiskNr = $matches['Disknr'].Trim()
$sddmatches2 = $sdd[$i+1] -match '\s{0,3}SERIAL:\s(.*)\s{0,4}'
#$sdd[$i+1] -match '\s{0,3}SERIAL:\s(.*)\s{1,4}Reserved:(.*)'
$UID = $matches[1].substring(0,32)
$DiskUID.add([int]$disknr,$UID)}
}
if ($sdd -match 'No device file found') {
$nodevfile = 1}
$volresults = $()
$wmivols = gwmi win32_volume
$startid = ($diskuid.getenumerator() | sort name | select name -first 1).name
For ($i=0;$i -lt ($vols.count);$i++)
{
$UID = 'No UID Found'
#write-host "start: " $i
$Psize = ''
$PLeft = ''
$PPath = ''
#$UID = (get-disk -number $i).UniqueID
$currLine = $Vols[$i]
$currLine -Match " Volume (?<volnum>...) +(?<drltr>...) +(?<lbl>.............) +(?<fs>.....) +(?<typ>..........) +(?<sz>.......) +(?<sts>.........)+(?<nfo>........)" | Out-Null
$LabelMatchWC = $Matches['lbl'].Trim()
$DRLTRMatchWC = $Matches['drltr'].Trim()
$VolObj = New-Object PSObject
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "VolumeNumber" -Value $Matches['volnum'].Trim()
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Letter" -Value $Matches['drltr'].Trim()
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Label" -Value $Matches['lbl'].Trim()
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "FileSystem" -Value $Matches['fs'].Trim()
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Type" -Value $Matches['typ'].Trim()
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Size" -Value $Matches['sz'].Trim()
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Status" -Value $Matches['sts'].Trim()
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Info" -Value $Matches['nfo'].Trim()
#$DiskNr = ($voldiskresults | where {$_.volnr -eq $i}).disknr
foreach ($vol in $voldiskresults) { if ($vol.volnr -eq $i) {$disknr = $vol.disknr}}
if ($nodevfile -or $nosddfile){$UID = 'No SDD Information Found - datapath info Missing'}
elseif ($diskNr -in $diskuid.GetEnumerator().name)
{
$UID = $Diskuid.get_Item($DiskNr)
}
else {$UID = 'No UID for Disk'
}
#write-host "UID: " $UID " - for Volume " $i " - Disk " $DiskNr
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "UID" -Value $UID
#write-host $LabelMatchWC " " $DRLTRMatchWC
#write-host $_.Label " " $_.DriveLetter[0]
if ($DRLTRMatchWC)
{
$PSize = ($wmivols | Where {$_.Driveletter} | Where-Object {$_.DriveLetter[0] -eq $DRLTRMatchWC}).Capacity
$PLeft = ($wmivols | Where {$_.Driveletter} |Where-Object {$_.DriveLetter[0] -eq $DRLTRMatchWC}).FreeSpace
#write-host "drltrmatch " ($wmivols | Where {$_.Driveletter}| Where-Object {$_.DriveLetter[0] -eq $DRLTRMatchWC}).DeviceID
$PPath = ($wmivols | Where {$_.Driveletter} |Where-Object {$_.DriveLetter[0] -eq $DRLTRMatchWC}).DeviceID
}
else
{
$VolName = ($voldiskresults | where {$_.volnr -eq $i}).volpath
$PSize = ($wmivols | Where {$_.Name} |Where-Object {$_.Name -eq $VolName}).Capacity
$PLeft = ($wmivols | Where {$_.Name} | Where-Object {$_.Name -eq $VolName}).FreeSpace
$PPath = ($wmivols | Where {$_.Name} | Where-Object {$_.Name -eq $VolName }).DeviceID
#write-host "labelmatch " ($wmivols | Where {$_.Label} | Where-Object {$_.Label -eq $LabelMatchWC}).DeviceID
}
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "PSize" -Value $PSize
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "PRemaining" -Value $PLeft
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Path" -Value $PPath
$dpscript = @"
select volume $($VolObj.VolumeNumber)
detail volume
"@
[array]$TempVO = $dpscript | diskpart
ForEach ($Line in $TempVO)
{
If ($Line.StartsWith("Read-only") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "ReadOnly" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("Hidden") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Hidden" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("No Default Drive Letter") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "NoDefaultDriveLetter" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("Shadow Copy") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "ShadowCopy" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("Offline") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Offline" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("BitLocker Encrypted") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "BitLockerEncrypted" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("Installable") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "Installable" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("Volume Capacity") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "VolumeCapacity" -Value $Line.Split(":")[1].Trim()
}
ElseIf ($Line.StartsWith("Volume Free Space") -and $Line -match ":")
{
Add-Member -InputObject $VolObj -MemberType NoteProperty -Name "VolumeFreeSpace" -Value $Line.Split(":")[1].Trim()
}
}
#write-host "End: " $i
[array]$VolResults += $VolObj
}}
foreach ($volresult in $volresults) {
foreach ($volarrayobj in $volumeobjectarray)
{if ($Volarrayobj.deviceid -eq $volresult.Path )
{
Add-Member -InputObject $Volarrayobj -MemberType NoteProperty -Name "UID" -Value $volresult.UID
$Disknr = ($voldiskresults | where {$_.volnr -eq $volresult.volumenumber}).disknr
Add-Member -InputObject $Volarrayobj -MemberType NoteProperty -Name "DiskNumber" -Value $Disknr
}
}
}
foreach ($entry in $VolumeObjectArray)
{write-host "$($entry.DeviceID);$($entry.Name);$($entry.Label);$($entry.Capacity);$($entry."Free Space");$($entry.UID);$($entry.DiskNumber)"}