Quantcast
Channel: Windows PowerShell forum
Viewing all articles
Browse latest Browse all 21975

Newbie PS Q: collecting Drive Info script fails

$
0
0

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)"}


Viewing all articles
Browse latest Browse all 21975

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>