Powershell слишком умный - PullRequest
7 голосов
/ 27 мая 2009

Извинения за то, что, вероятно, вопрос новичка.

Я пишу несколько скриптов Powershell, которые выполняют различные запросы к AD. Обычно они возвращают кучу результатов, с которыми легко иметь дело, например:

$results = myQuery
write-host "Returned " + $results.Count + " results."
foreach ($result in $results) { doSomething }

Не беспокойся. Однако, если есть только 1 результат, Powershell автоматически преобразует этот результат в один объект, а не в массив, содержащий 1 объект. Таким образом, вышеприведенный код будет нарушен как в Count, так и в foreach. Я уверен, что та же проблема возникнет с 0 результатами.

Может ли кто-нибудь предложить элегантный способ справиться с этим? Может быть, какой-нибудь способ привести результаты, чтобы они всегда были массивом?

Ответы [ 3 ]

11 голосов
/ 27 мая 2009

Измените первую строку кода на

$results = @(myQuery)

Это всегда будет возвращать массив. См. эту запись в блоге для получения дополнительной информации.

1 голос
/ 29 мая 2009

На самом деле, foreach работает просто отлично. Все виды использования foreach (ключевое слово foreach, командлет Foreach-Object и псевдонимы Foreach-Object «foreach» и «%») имеют одинаковое поведение «оборачивания» рассматриваемого объекта в массив при необходимости. Таким образом, все виды использования foreach будут работать как со скалярными значениями, так и со значениями массивов.

Досадно, это означает, что они тоже работают с нулевыми значениями. Скажи, что я делаю:

$x = $null
foreach ($y in $x) {Write-Host "Hello world 1"}
$x | Foreach-Object {Write-Host "Hello world 2"}

Я получу

"Hello world 1"
"Hello world 2"

из этого.

0 голосов
/ 27 мая 2009

Меня это тоже укусило. Нет умных идей о том, как исправить $results.Count, но foreach можно исправить, переключившись на конвейер.

$scalar = 1
$list = (1,2)
$list | % { $_ }

печать 1 2

$scalar | % { $_ }

печать 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...