Объедините информацию Get-Disk и информацию LogicalDisk в PowerShell (но с форматированным выводом) - PullRequest
1 голос
/ 02 августа 2020

Это вопрос об ответе на этот Объединить информацию `Get-Disk` и информацию` LogicalDisk` в PowerShell?

Вот ответ, который я пытался изменить чтобы вывод был отформатирован так, как я хочу: { ссылка }

Он должен работать для нескольких дисков, как приведенный ниже код, только в желаемом формате.

Это код со всеми подробностями о моих попытках:

$info_diskdrive_basic = Get-WmiObject Win32_DiskDrive | ForEach-Object {
  $disk = $_
  $partitions = "ASSOCIATORS OF " + "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " + "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | ForEach-Object {
    $partition = $_
    $drives = "ASSOCIATORS OF " + "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " + "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | ForEach-Object {
      [PSCustomObject][Ordered]@{
        Disk          = $disk.DeviceID
        DiskModel     = $disk.Model
        Partition     = $partition.Name
        RawSize       = '{0:d} GB' -f [int]($partition.Size/1GB)
        DriveLetter   = $_.DeviceID
        VolumeName    = $_.VolumeName
        Size          = '{0:d} GB' -f [int]($_.Size/1GB)
        FreeSpace     = '{0:d} GB' -f [int]($_.FreeSpace/1GB)
      }
    }
  }
}

# Here's my attempt at formatting the output of the code above.

# 1. This trims the dead whitespace from the output.
$info_diskdrive_basic = ($info_diskdrive_basic | Out-String) -replace '^\s+|\s+$', ('')

# 2. I then separate the DiskModel, RawSize, DriveLetter, VolumeName, FreeSpace with the regexp below so this becomes:
# Disk Model, Raw Size, Drive Letter, Volume Name, Free Space
$info_diskdrive_basic = ($info_diskdrive_basic) -replace '(?-i)(?=\B[A-Z][a-z])', (' ')

# 3. Here I then format the string to how I want:
$info_diskdrive_basic = ($info_diskdrive_basic) -replace '(.+?)(\s+):\s*(?!\S)', ($id2 + '$1:$2                                       ')

$info_diskdrive_basic

Результат должен выглядеть следующим образом:

Я хочу отформатировать свойства и значения следующим образом: Properties: >spaces< value, где значение смещено вправо и выровнено по левому краю

# Disk:                                                 \\.\PHYSICALDRIVE0
# Disk Model:                                           Crucial_CT512MX100SSD1
# Partition:                                            Disk #0, Partition #2
# Raw Size:                                             476 GB
# Drive Letter:                                         C:
# Volume Name:
# Size:                                                 476 GB
# Free Space:                                           306 GB

Но мой результат заканчивается так: (Обратите внимание, как текст не выровнен)

# Disk:                                                \\.\PHYSICALDRIVE0
# Disk Model:                                           Crucial_CT512MX100SSD1
# Partition:                                           Disk #0, Partition #2
# Raw Size:                                             476 GB
# Drive Letter:                                         C:
# Volume Name:
# Size:                                                476 GB
# Free Space:                                           306 GB

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Чтобы выводить информацию, которая вам, по-видимому, нужна, нам нужно знать максимальную длину строки (которая в вашем примере составляет 79 символов) и работать с ней.

<code>$maxLineLength  = 79  # counted from the longest line in your example
$maxValueLength = 0   # a counter to keep track of the largest value length in characters

$info_diskdrive_basic = Get-WmiObject Win32_DiskDrive | ForEach-Object {
    $disk = $_
    $partitions = "ASSOCIATORS OF " + "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " + "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
    Get-WmiObject -Query $partitions | ForEach-Object {
        $partition = $_
        $drives = "ASSOCIATORS OF " + "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " + "WHERE AssocClass = Win32_LogicalDiskToPartition"
        Get-WmiObject -Query $drives | ForEach-Object {
            $obj = [PSCustomObject]@{
                'Disk'         = $disk.DeviceID
                'Disk Model'   = $disk.Model
                'Partition'    = $partition.Name
                'Raw Size'     = '{0:d} GB' -f [int]($partition.Size/1GB)
                'Drive Letter' = $_.DeviceID
                'Volume Name'  = $_.VolumeName
                'Size'         = '{0:d} GB' -f [int]($_.Size/1GB)
                'Free Space'   = '{0:d} GB' -f [int]($_.FreeSpace/1GB)
            }
            # get the maximum length for all values
            $len = ($obj.PsObject.Properties.Value.ToString().Trim() | Measure-Object -Property Length -Maximum).Maximum
            $maxValueLength = [Math]::Max($maxValueLength, $len)
                                          
            # output the object to be collected in $info_diskdrive_basic
            $obj
        }
    }
}

# sort the returned array of objects on the DriveLetter property and loop through
$result = $info_diskdrive_basic | Sort-Object DriveLetter | ForEach-Object {
    # loop through all the properties and calculate the padding needed for the output
    $_.PsObject.Properties | ForEach-Object {
        $label   = '# {0}:' -f $_.Name.Trim()
        $padding = $maxLineLength - $maxValueLength - $label.Length
        # output a formatted line
        "{0}{1,-$padding}{2}" -f $label, '', $_.Value.ToString().Trim()
    }
    # add a separator line between the disks
    ''
}

# output the result on screen
$result

# write to disk
$result | Set-Content -Path 'X:\theResult.txt'

# format for HTML mail:
'<pre>{0}
'-f ($ result -join '
')

Пример вывода:

# Disk:                                              \\.\PHYSICALDRIVE1
# Disk Model:                                        Samsung SSD 750 EVO 250GB
# Partition:                                         Disk #1, Partition #0
# Raw Size:                                          232 GB
# Drive Letter:                                      C:
# Volume Name:                                       System
# Size:                                              232 GB
# Free Space:                                        160 GB

# Disk:                                              \\.\PHYSICALDRIVE2
# Disk Model:                                        WDC WD7501AALS-00J7B0
# Partition:                                         Disk #2, Partition #0
# Raw Size:                                          699 GB
# Drive Letter:                                      D:
# Volume Name:                                       Data
# Size:                                              699 GB
# Free Space:                                        385 GB

PS при создании [PsCustomObject], добавлять [Ordered]* не нужно 1014 *

0 голосов
/ 03 августа 2020

Используя ваш опубликованный код как есть, «стяните» ваши свойства

Например:

($info_diskdrive_basic = Get-WmiObject Win32_DiskDrive | 
ForEach-Object {
  $disk       = $_
  $partitions = "ASSOCIATORS OF " + 
                  "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " + 
                  "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | 
  ForEach-Object {
    $partition = $_
    $drives    = "ASSOCIATORS OF " + 
                "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " + 
                "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | 
    ForEach-Object {
      [PSCustomObject][Ordered]@{
        Disk          = "$($disk.DeviceID)"
        DiskModel     = "$($disk.Model)"
        Partition     = "$($partition.Name)"
        RawSize       = "$('{0:d} GB' -f [int]($partition.Size/1GB))"
        DriveLetter   = "$($_.DeviceID)"
        VolumeName    = "$($_.VolumeName)"
        Size          = "$('{0:d} GB' -f [int]($_.Size/1GB))"
        FreeSpace     = "$('{0:d} GB' -f [int]($_.FreeSpace/1GB))"
      }
    }
  }
})
# Results
<#
Disk        : \\.\PHYSICALDRIVE0
DiskModel   : Samsung SSD 950 PRO 512GB
Partition   : Disk #0, Partition #0
RawSize     : 477 GB
DriveLetter : D:
VolumeName  : Data
Size        : 477 GB
FreeSpace   : 364 GB
...
#>

Обратите внимание:

Я использую сжатие переменной PowerShell до назначить результаты переменной и вывести на экран одновременно.

Обновить

Что касается этого ...

"Я хочу отформатировать свойства и значения следующим образом: Свойства:> пробелы <значение" </p>

$Spacer = ("`t")*8

($info_diskdrive_basic = Get-WmiObject Win32_DiskDrive | 
ForEach-Object {
  $disk       = $_
  $partitions = "ASSOCIATORS OF " + 
                  "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " + 
                  "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | 
  ForEach-Object {
    $partition = $_
    $drives    = "ASSOCIATORS OF " + 
                "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " + 
                "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | 
    ForEach-Object {
      [PSCustomObject][Ordered]@{
        Disk          = "$Spacer$($disk.DeviceID)"
        DiskModel     = "$Spacer$($disk.Model)"
        Partition     = "$Spacer$($partition.Name)"
        RawSize       = "$Spacer$('{0:d} GB' -f [int]($partition.Size/1GB))"
        DriveLetter   = "$Spacer$($PSItem.DeviceID)"
        VolumeName    = "$Spacer$($PSItem.VolumeName)"
        Size          = "$Spacer$('{0:d} GB' -f [int]($PSItem.Size/1GB))"
        FreeSpace     = "$Spacer$('{0:d} GB' -f [int]($PSItem.FreeSpace/1GB))"
      }
    }
  }
})
# Results
<#
Disk        :                               \\.\PHYSICALDRIVE0
DiskModel   :                               Samsung SSD 950 PRO 512GB
Partition   :                               Disk #0, Partition #0
RawSize     :                               477 GB
DriveLetter :                               D:
VolumeName  :                               Data
Size        :                               477 GB
FreeSpace   :                               364 GB
...
#>
...