Compare-Object возвращает неожиданный вывод - PullRequest
0 голосов
/ 31 декабря 2018

Я создал небольшую функцию, которая записывает Get-Volume в локальный файл.В следующий раз, когда функция запускается, она сравнивает выходные данные нового Get-Volume с ранее сохраненным в файловой системе.

Эта функция отлично работает для сервисов, но странным образом возвращает том как «другой», дажехотя мы можем видеть из выходных данных, что это не так.

function Compare-Volumes{
    $Path = "$Env:PROGRAMDATA\VACS\states\"
    $File = "volumes.csv"
    $Volumes = Get-Volume | Select-Object OperationalStatus, HealthStatus, DriveType, FileSystemType, DedupMode, UniqueId, AllocationUnitSize, DriveLetter, FileSystem, FileSystemLabel, Size

    if (![System.IO.File]::Exists($Path+$File)){
        $Volumes | Export-CSV -Path $Path$File -Force
    }else{
        # Load file to object, get differences, submit to API, replace previous snapshot in file with new one
        $Snapshot = Import-CSV -Path "$Path$File"
        $StatusChanges = Compare-Object -ReferenceObject ($Snapshot) -DifferenceObject ($Volumes) -Property OperationalStatus, HealthStatus, DriveType, FileSystemType, DedupMode, UniqueId, AllocationUnitSize, DriveLetter, FileSystem, FileSystemLabel, Size -IncludeEqual
        $StatusChanges
        $Volumes | Export-CSV -Path $Path$File -Force
    }
}

Мои ожидаемые результаты состоят в том, что все возвращается как равное / неизменное (==), поскольку ни одно из свойств не изменяется, как ясно в выходных данных ниже.,Однако по какой-то причине свойство SideIndicator, добавленное Compare-Object, указывает на различия в значениях для тома, помеченного Recovery.

OperationalStatus  : Unknown
HealthStatus       : Healthy
DriveType          : CD-ROM
FileSystemType     : Unknown
DedupMode          : Disabled
UniqueId           : \\?\Volume{2b4803c9-1ebe-11e6-9bed-005056c00008}\
AllocationUnitSize : 0
DriveLetter        : E
FileSystem         : 
FileSystemLabel    : 
Size               : 0
SideIndicator      : ==

OperationalStatus  : OK
HealthStatus       : Healthy
DriveType          : Fixed
FileSystemType     : NTFS
DedupMode          : NotAvailable
UniqueId           : \\?\Volume{f688d14f-0ee7-11e5-b210-806e6f6e6963}\
AllocationUnitSize : 4096
DriveLetter        : C
FileSystem         : NTFS
FileSystemLabel    : Windows
Size               : 953903214592
SideIndicator      : ==

OperationalStatus  : Unknown
HealthStatus       : Healthy
DriveType          : CD-ROM
FileSystemType     : Unknown
DedupMode          : Disabled
UniqueId           : \\?\Volume{f688d152-0ee7-11e5-b210-806e6f6e6963}\
AllocationUnitSize : 0
DriveLetter        : D
FileSystem         : 
FileSystemLabel    : 
Size               : 0
SideIndicator      : ==

OperationalStatus  : OK
HealthStatus       : Healthy
DriveType          : Fixed
FileSystemType     : NTFS
DedupMode          : NotAvailable
UniqueId           : \\?\Volume{f688d14e-0ee7-11e5-b210-806e6f6e6963}\
AllocationUnitSize : 4096
DriveLetter        : 
FileSystem         : NTFS
FileSystemLabel    : Recovery
Size               : 6291451904
SideIndicator      : =>

OperationalStatus  : OK
HealthStatus       : Healthy
DriveType          : Fixed
FileSystemType     : NTFS
DedupMode          : NotAvailable
UniqueId           : \\?\Volume{f688d14e-0ee7-11e5-b210-806e6f6e6963}\
AllocationUnitSize : 4096
DriveLetter        : 
FileSystem         : NTFS
FileSystemLabel    : Recovery
Size               : 6291451904
SideIndicator      : <=

1 Ответ

0 голосов
/ 31 декабря 2018

Странно, что это свойство DriveLetter, которое ложно сравнивает
с томами, у которых его нет (например, раздел восстановления).

Предположительно, вам нужно будет включить объект Select с вычисляемым свойством
, который также проверяет DriveLetter [string]::IsNullOrEmpty()
, чтобы избежать сравнения $ Null со строковым выводом "" Export-CSV

Ваш сценарий, немного оптимизирован:

## Q:\Test\2018\12\31\SO_53990220.ps1

function Compare-Volumes{
    $FilePath = Join-Path "$Env:PROGRAMDATA\VACS\states\" "volumes.csv"

    $Volumes = Get-Volume | Select-Object OperationalStatus,HealthStatus,DriveType,
        FileSystemType, DedupMode,UniqueId,AllocationUnitSize,FileSystemLabel,FileSystem,Size,
        @{n='DriveLetter';e={if([string]::IsNullOrEmpty($_.DriveLetter)){""}else{$_.DriveLetter}}}

    if (Test-Path $FilePath){
        # Load file to object, get differences, submit to API, replace previous snapshot in file with new one
        $Snapshot = Import-CSV -Path $FilePath
        $StatusChanges = Compare-Object -ReferenceObject ($Snapshot) -DifferenceObject ($Volumes) `
          -IncludeEqual -Property OperationalStatus,HealthStatus,DriveType,FileSystemType,
          DedupMode,UniqueId,AllocationUnitSize,FileSystemLabel,FileSystem,Size,
          DriveLetter
        $StatusChanges
    }
    $Volumes | Export-CSV -Path $FilePath -Force -NoTypeInformation
}

Compare-Volumes
...