YuS 2
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору iNNOKENTIY21 Цитата: Собственно, как реализовать работу [switch] $FirstOnline ? | Ты чего, не выспался? условный блок же if ($switch ) { return $var } Но... тут важно помнить: Цитата: However, there's an important difference. When you pipe multiple objects to a command, PowerShell sends the objects to the command one at a time. When you use a command parameter, the objects are sent as a single array object. This minor difference has significant consequences. | Цитата: Однако есть важное отличие. Когда вы передаете команде несколько объектов по конвейеру, PowerShell отправляет объекты команде по одному. Когда вы используете параметр команды, объекты отправляются как один объект массива. Это незначительное различие имеет серьезные последствия. | то бишь, прервать вызов функции по конвейеру, из самой функции, вряд ли получится... В общем, как-то так: Код: function Test { param ( [Parameter(ValueFromPipeline)] [ValidateNotNullOrEmpty()] [string[]] $Servers = @("example10.com","google.com","bing.com","yandex.com"), # Если указан, оффлайн не возвращать, вернуть, первый же онлайн сервер, # дальше не проверять, выйти из функции. [switch] $FirstOnline ) process { foreach ($serv in $Servers) { $IsOnline = Test-Connection -ComputerName $serv -Count 1 -Quiet $var = [pscustomobject] @{ Server = $serv IsOnline = $IsOnline } if ($FirstOnline) { if ($IsOnline) { return $var } } else { $var } } } } # Должно работать при обоих вызовах $arr = "example10.com","bing.com","google.com" # ВАЖНО - здесь объекты передаются функции по одному, поэтому результат будет # состоять из всех серверов ответивших на пинг: #$arr | Test -FirstOnline # Здесь объекты передаются массивом, поэтому результат будет состоять только из # первого ответившего сервера: #Test $arr -FirstOnline | Добавлено: Да, там есть возможность передать массив через конвейер целиком, но он должен быть хэштаблицей... по-моему, так, если ничего не перепутал... надо бы освежить память... Либо в секции process создавать массив и суммировать в него объекты, а в секции end, в зависимости от состояния ключа, выдавать либо весь массив, либо первый элемент с True... но, это будет подгонка под результат, т.к., всё равно, функция будет вызвана столько раз, сколько объектов передано по конвейеру. | Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 07:47 06-02-2021 | Исправлено: YuS 2, 08:09 06-02-2021 |
|