Я использую Powershell для настройки привязок IIS на веб-сервере, и у меня возникла проблема со следующим кодом:
$serverIps = gwmi Win32_NetworkAdapterConfiguration
| Where { $_.IPAddress }
| Select -Expand IPAddress
| Where { $_ -like '*.*.*.*' }
| Sort
if ($serverIps.length -le 1) {
Write-Host "You need at least 2 IP addresses for this to work!"
exit
}
$primaryIp = $serverIps[0]
$secondaryIp = $serverIps[1]
Если на сервере 2+ IP-адреса, отлично - Powershell возвращает массив, и я могу запросить длину массива и легко извлечь первый и второй адреса.
Проблема в том, что если есть только один IP-адрес, Powershell не возвращает одноэлементный массив, он возвращает IP-адрес (в виде строки, например "192.168.0.100") - строка имеет .length
свойство, оно больше 1, поэтому тест проходит, и я получаю первые два символа в строке вместо первых двух IP-адресов в коллекции.
Как я могу заставить Powershell возвращать одноэлементную коллекцию или, альтернативно, определить, является ли возвращенная «вещь» объектом, а не коллекцией?
powershell
Дилан Битти
источник
источник
Ответы:
Определите переменную как массив одним из двух способов ...
Заключите передаваемые по конвейеру команды в круглые скобки с
@
началом:Укажите тип данных переменной в виде массива:
Или проверьте тип данных переменной ...
источник
@(...)
оболочку вернет массив, даже если есть нулевые объекты. В то время как присвоение результата[Array]
переменной с типом -типом все равно вернет $ null, если есть нулевые объекты.@(...)
нормально работать (давать результат, который, как я ожидаю, должен) для любых типов объектов.Return ,$out
что, кажется, всегда работает. Если я снова столкнусь с проблемой, я опубликую пример.Переведите результат в массив, чтобы у вас было свойство Count. Отдельные объекты (скалярные) не имеют свойства Count. Строки имеют свойство длины, поэтому вы можете получить ложные результаты, используйте свойство Count:
Кстати, вместо использования подстановочного знака, который также может соответствовать строкам, используйте оператор -as:
источник
-is
?Если вы заранее объявите переменную как массив, вы можете добавлять в нее элементы - даже если это всего лишь один ...
Это должно работать ...
источник
Вы можете использовать
Measure-Object
для получения фактического количества объектов, не прибегая кCount
свойствам объекта.источник
Вы можете либо добавить запятую (
,
) перед списком возврата, например,return ,$list
либо указать его,[Array]
либо[YourType[]]
там, где вы обычно используете список.источник
У меня возникла проблема с передачей массива в шаблон развертывания Azure. Если был один объект, PowerShell «конвертировал» его в строку. В приведенном ниже примере
$a
возвращается из функции, которая вызывает возражения ВМ в соответствии со значением тега. Я передать$a
вNew-AzureRmResourceGroupDeployment
командлет, окружив его@()
. Вот так:VMObject
- один из параметров шаблона.Возможно, это не самый технический / надежный способ сделать это, но для Azure этого достаточно.
Обновить
Что ж, все вышеперечисленное сработало. Я пробовал все вышеперечисленное и некоторые, но единственный способ передать его
$vmObject
как массив, совместимый с шаблоном развертывания, с одним элементом, выглядит следующим образом (я ожидаю, что MS снова играет (это был отчет и исправлен баг в 2015 году)):$vmObjects
является результатом Get-AzureRmVM.Перехожу
$DeserializedJson
к параметру шаблона развертывания (типа массив).Для справки, прекрасные ошибки
New-AzureRmResourceGroupDeployment
:источник
Возврат как объект, на который есть ссылка, поэтому он никогда не преобразовывался при передаче.
источник