Objetos sin propiedad '.Count': uso de @ () (operador de subexpresión de matriz) vs. conversión [Array]
Estoy tratando de realizar algunas declaraciones if simples, pero todos los cmdlets más nuevos que se basan en [Microsoft.Management.Infrastructure.CimInstance] no parecen exponer un método .count?
$Disks = Get-Disk
$Disks.Count
No devuelve nada. Descubrí que puedo convertir esto como [matriz], lo que hace que devuelva un método .NET .count como se esperaba.
[Array]$Disks = Get-Disk
$Disks.Count
Esto funciona sin convertirlo directamente como una matriz para cmdlets anteriores:
(Get-Services).Count
¿Cuál es la forma recomendada de evitar esto?
Un ejemplo que no funciona:
$PageDisk = Get-Disk | Where {($_.IsBoot -eq $False) -and ($_.IsSystem -eq $False)}
If ($PageDisk.Count -lt 1) {Write-Host "No suitable drives."; Continue}
Else If ($PageDisk.Count -gt 1) {Write-Host "Too many drives found, manually select it."}
Else If ($PageDisk.Count -eq 1) { Do X }
Opción A (Cast as Array):
[Array]$PageDisk = Get-Disk | Where {($_.IsBoot -eq $False) -and ($_.IsSystem -eq $False)}
If ($PageDisk.Count -lt 1) {Write-Host "No suitable drives."; Continue}
Else If ($PageDisk.Count -gt 1) {Write-Host "Too many drives found, manually select it."}
Else If ($PageDisk.Count -eq 1) { Do X }
Opción B (Usar índices de matriz):
$PageDisk = Get-Disk | Where {($_.IsBoot -eq $False) -and ($_.IsSystem -eq $False)}
If ($PageDisk[0] -eq $Null) {Write-Host "No suitable drives."; Continue}
Else If ($PageDisk[1] -ne $Null) {Write-Host "Too many drives found, manually select it."}
Else If (($PageDisk[0] -ne $Null) -and (PageDisk[1] -eq $Null)) { Do X }
Opción C (matriz) -Gracias a @PetSerAl:
$PageDisk = @(Get-Disk | Where {($_.IsBoot -eq $False) -and ($_.IsSystem -eq $False)})
If ($PageDisk.Count -lt 1) {Write-Host "No suitable drives."; Continue}
Else If ($PageDisk.Count -gt 1) {Write-Host "Too many drives found, manually select it."}
Else If ($PageDisk.Count -eq 1) { Do X }
¿Cuál es la razón por la cual los cmdlets basados en CIM no exponen el método .Count? ¿Cuál es la forma recomendada de manejar esto? La opción B me parece complicada y difícil de leer. La opción A funciona, pero ¿no debería PowerShell lanzar esto como una matriz para mí? ¿Voy sobre esto de una manera completamente incorrecta?