2017-05-03 43 views
1

我試圖獲取Windows系統上所有驅動器的加密狀態,並在自定義格式輸出中對該列表進行排序。我需要這個,因爲輸出到一個Nagios服務器;它會混淆Get-BitLockerVolume的標準輸出格式並且太長。PowerShell:爲自定義輸出排序驅動器加密狀態

這是我到目前爲止。我試圖以這樣一種方式對輸出進行排序,即首先列出系統驅動器並給出安裝點(驅動器盤符)以及百分比。

[array]$DriveTypes = Get-BitLockerVolume | Sort-Object VolumeType | Select-Object VolumeType 
[array]$DriveMounts = Get-BitLockerVolume | Sort-Object VolumeType | Select-Object MountPoint 
[array]$WDEPercent = Get-BitLockerVolume | Sort-Object VolumeType | Select-Object EncryptionPercentage 

for ($i = 0; $i -lt $DriveTypes.Count; $i++) { 
    if ($DriveIndex -eq $DriveTypes.Count) { 
     $TextDriveListing = $TextDriveListing + $DriveMounts.MountPoint+" ("+$DriveTypes.VolumeType+") at "+$WDEPercent.EncryptionPercentage+"%." 
    } 
    else { 
     $TextDriveListing = $TextDriveListing + $DriveMounts.MountPoint+" ("+$DriveTypes.VolumeType+") at "+$WDEPercent.EncryptionPercentage+"%, " 
    } 
    if ($WDEPercent.EncryptionPercentage -lt $ReqValue) { 
     $NoEncryptFlag = 1 
    } 
} 

我期望的輸出,例如,是這樣的:

C: (OperatingSystem) at 100%, D: (Data) at 0%.

我實際上最終是這樣的:

C: D: (OperatingSystem Data) at 100 0%, C: D: (OperatingSystem Data) at 100 0%,

我曾嘗試一些東西的答案派生來「 How to sort a Multi Dimensional Array in Powershell「來測試它,註釋掉我前面提到的for區塊並放入:

$ListDrives | ForEach-Object { 
    Get-BitLockerVolume @{ 
    MountPoint = $_[0] 
    EncryptionPercentage = $_[1] 
    } 
} | Sort-Object VolumeType 
Write-Host $ListDrives 

那吐出這個錯誤:

Cannot index into a null array. At C:****************.ps1:142 char:3

  • Get-BitLockerVolume @{
  • ~~~~~~~~~~~~~~~~~~~~~~
    • CategoryInfo : InvalidOperation: (:) [], RuntimeException
    • FullyQualifiedErrorId : NullArray

我在做什麼錯?有什麼建議麼?

非常感謝!

+0

難道你不想在'for'循環中使用'$ i'嗎? –

回答

1

試試這個:

for ($i = 0; $i -lt $DriveTypes.Count; $i++) { 
    if ($i -eq ($DriveTypes.Count - 1)) { 
     $TextDriveListing = $TextDriveListing + $DriveMounts[$i].MountPoint+" ("+$DriveTypes[$i].VolumeType+") at "+$WDEPercent[$i].EncryptionPercentage+"%." 
    } 
    else { 
     $TextDriveListing = $TextDriveListing + $DriveMounts[$i].MountPoint+" ("+$DriveTypes[$i].VolumeType+") at "+$WDEPercent[$i].EncryptionPercentage+"%, " 
    } 
    if ($WDEPercent[$i].EncryptionPercentage -lt $ReqValue) { 
     $NoEncryptFlag = 1 
    } 
} 

你沒有使用從for循環$i訪問您的收藏具體指標(我已經添加[$ i]於每個您的收藏變量這樣做)。你也使用了一個叫做$DriveIndex的變量,這個變量從來沒有被填充過,我認爲這需要與$i進行比較,但是這個邏輯也是永遠不會變成真的,因爲For循環會在它結束之前結束(所以我已經改變了邏輯($i -eq ($DriveTypes.Count - 1))

這裏有一個整潔的版本,我認爲也可以讓你同樣的結果:

$TextDriveListing = '' 
$Drives = Get-BitLockerVolume | Sort-Object VolumeType | Select VolumeType,MountPoint,EncryptionPercentage 
$Drives | ForEach-Object { 

    $TextDriveListing += "$($_.MountPoint) ($($_.VolumeType)) at $($_.EncryptionPercentage)%," 
    If ($_.EncryptionPercentage -lt $ReqValue) { $NoEncryptFlag = 1 } 

} -End { $TextDriveListing -Replace ',$','.' } 
  • 用一個單一變量爲你想訪問的三個屬性,而不是把他們用於分離不必要的變量。
  • 使用ForEach-Object循環通過特殊標記$_訪問該集合中的每個項目(及其屬性)。
  • 使用單引號字符串輸出,通過子表達式運算符$()訪問對象/屬性。
  • 在每行末尾加一個逗號,但在ForEach結尾處使用正則表達式來替換句尾處的逗號(正則表達式:$令牌),並使用句號。

這兩組代碼都未經測試,因此可能需要調整。