Я пытаюсь выполнить несколько простых операторов if, но все новые командлеты, основанные на [Microsoft.Management.Infrastructure.CimInstance], похоже, не предоставляют метод .count?
$Disks = Get-Disk
$Disks.Count
Ничего не возвращает. Я обнаружил, что могу преобразовать это как [массив], что заставляет его возвращать метод .NET .count, как и ожидалось.
[Array]$Disks = Get-Disk
$Disks.Count
Это работает без прямого преобразования его в массив для предыдущих командлетов:
(Get-Services).Count
Какой рекомендуемый способ обойти это?
Пример, который не работает:
$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 }
Вариант А (преобразование в массив):
[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 }
Вариант B (использовать индексы массива):
$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 }
Вариант C (Массив) - Спасибо @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 }
В чем причина того, что командлеты на основе CIM не предоставляют метод .Count? Каков рекомендуемый способ справиться с этим? Вариант Б кажется мне запутанным и трудным для чтения. Вариант А работает, но не следует ли PowerShell преобразовывать его в массив для меня? Я поступаю совершенно неправильно?
(Get-Services).Count
работает, потому чтоGet-Services
возвращает несколько объектов. Если вам нужен массив (потенциально из 0 или 1 объекта (ов)), используйте оператор подвыражения массива (@(...)
), как предложено @PetSerAl выше. - person Mathias R. Jessen   schedule 13.07.2017[Array]$a = &{}; $b = @(&{}); $a.GetType(); $b.GetType()
или[Array]$a = New-Object Object[] 10; $b = @(New-Object Object[] 10); $a.Count; $b.Count
или[Array]$a = New-Object Collections.Generic.List[Object]; $b = @(New-Object Collections.Generic.List[Object]); $a.Count; $b.Count
. - person user4003407   schedule 13.07.2017