Как присвоить вывод командлета переменной и как использовать переменную с сохранённым выводом
Оглавление
- Как сохранить вывод командлета в переменную
- Как вывести содержимое переменной в Терминал
- Как обработать содержимое переменной с помощью командлета
- Как посчитать количество строк в переменной
- Как получить представление о содержимом переменной без вывода результатов целиком
- Как вывести только одно из свойств переменной
- Как проверить, содержит ли переменная искомое значение
- Как посчитать, сколько раз в объекте встречаются элементы с определённым свойством
- Как проверить тип переменной
- Как очистить значение переменной
- Заключение
Рассмотрим синтаксис PowerShell связанный с переменными. Используя показанный в этой заметке синтаксис вы сможете сохранять вывод командлета в переменную, благодаря чему вы сможете использовать полученные данные многократно без необходимости вызывать команду снова и снова. Также вы узнаете о способах обращения и обработки свойств объекта, хранимого в переменной без необходимости использовать командлеты ForEach-Object и Where-Object.
Как сохранить вывод командлета в переменную
Если вы уже привыкли к синтаксису передачи данных от командлета к командлету по конвейеру (по трубе, «|»), то в случае с переменными это не сработает.
Чтобы сохранить данные в переменную, напишите её перед командлетом и поставьте знак равно, например:
$a = Get-ChildItem
Если вы хотите присвоить переменной результат выполнения работы последовательности командлетов, то просто укажите желаемую команду после знака равно:
$a = Get-ChildItem | Get-Member
Как вы можете видеть, вам необязательно обозначать группу команд круглыми скобками, но при желании вы можете это сделать, чтобы присвоение вывода переменной было более наглядным:
$a = (Get-ChildItem | Get-Member)
Как вывести содержимое переменной в Терминал
Чтобы показать содержимое переменной, достаточно просто написать саму эту переменную. При желании, вы можете использовать команду echo или командлет Write-Output. Все следующие 3 команды дадут идентичный результат:
$a echo $a Write-Output $a
Смотрите также: Аналог echo в PowerShell
Как обработать содержимое переменной с помощью командлета
Используйте следующую конструкцию:
VARIABLE | CMDLET
Например:
$a | Format-Table -Property Name
Как посчитать количество строк в переменной
Чтобы узнать количество строк в переменной (если быть более точным, чтобы узнать количество объектов в коллекции) используйте свойство .Count:
$a = Get-ChildItem $a.Count
Строго говоря, считаем не количество строк, а количество объектов в массиве (в коллекции). Обычно эти значения совпадают. Но можно предположить ситуацию, когда массиве присутствуют другие массивы (коллекции). В этом случае будет подсчитано количество элементов только только для родительского массива. Рассмотрим следующий пример:
$b=7,8,9 $c = 1,2,3,$b
Теперь если мы выведем содержимое переменной $c, то мы получим 6 элементов:
$c 1 2 3 7 8 9
Но свойство .Count покажет, что на самом деле в переменной $c всего лишь четыре элемента:
$c.Count 4
Как получить представление о содержимом переменной без вывода результатов целиком
С помощью командлета Get-Item вы можете «заглянуть» в содержимое переменной без полного вывода её содержимого.
Синтаксис следующий (замените VARIABLE на имя переменной без символа «$»):
Get-Item Variable:\VARIABLE
Например:
$a = Get-ChildItem Get-Item Variable:\a
Проверим таким способом содержимое переменной $c
$b=7,8,9 $c = 1,2,3,$b Get-Item Variable:\c
Как вывести только одно из свойств переменной
Вместо того, чтобы использовать дополнительные командлеты для фильтрации определённых свойств, вы можете обратиться к свойствам переменной напрямую. То есть вместо следующих команд (обе они дадут похожие, хотя и не идентичные результаты):
$a | Format-Table -Property FullName $a | ForEach-Object {$_.FullName}
вы можете использовать следующий более компактный синтаксис, который даст точно такой же результат, как и предыдущие команды:
$a.FullName
Вы можете вывести любое из свойств каждого объекта переменной, например:
$a.Name $a.LastWriteTime
Как проверить, содержит ли переменная искомое значение
Предположим, в переменной $a содержится список подпапок текущей папки:
$a = Get-ChildItem
И нам нужно узнать, имеется ли среди них папка с именем «Contacts»? Можно ли это узнать без полного перебора всех элементов коллекции?
Вы можете проверить содержится ли определённое значение в объекте с помощью метода .Contains(). Обратите внимание, что этот метод указывается не для всей переменной, а для того свойства, в котором мы ищем указанную папку — в данном случае мы ищем папку «Contacts» в именах папок (.Name):
$a.Name.Contains('Contacts')
Обратите внимание, что в данном случае будет выведено логическое значение True или False.
Также для проверки, имеется ли определённый объект в переменной (точнее говоря, соответствует ли значение свойства одного из объектов указанной строке или числу) можно следующим образом:
$a.Name -eq "Contacts"
В этом случае вместо логического значения будет возвращена строка с искомым содержимым, либо ничего не будет возвращено, если объект не найден.
Как посчитать, сколько раз в объекте встречаются элементы с определённым свойством
Рассмотрим следующий пример, который считает, сколько процессов имеют приоритет «Normal»:
$d = Get-Process ($d | Where-Object {$_.PriorityClass -eq "Normal"}).Count
Аналогом рассмотренной выше команды является:
($d.PriorityClass -eq "Normal").Count
То есть для подсчёте объектов с определённым свойством можно обойтись без командлета Where-Object и использовать конструкцию вида:
(VARIABLE.PROPERTY -eq "STRING").Count
В этой команде:
- VARIABLE — переменная (коллекция), по объектам которой производится поиск
- PROPERTY — свойство экземпляров коллекции, по которому производится поиск
- STRING — искомое значение
Как проверить тип переменной
Прежде всего, необходимо различать тип самой переменной и тип хранимых в ней данных.
Для проверки типа переменной (коллекции) можно использовать метод .GetType():
$a.GetType()
Подробности смотрите в статье: Как определить тип объекта в PowerShell
Как очистить значение переменной
Казалось бы, банальная задача — что может быть проще, очистить значение переменной. Например, по аналогии с большинством языков программирования можно предложить присваивание пустого значения:
$a = Get-ChildItem $a = ''
Но это не совсем очистка. Теперь в переменной содержится пустая строка. Вывод такой переменный и действительно пустой (или не существующей) переменной различается.
Для очистки переменных содержащих объект, можно использовать метод .Clear():
$a = Get-ChildItem $a.Clear()
Но при попытке применить этот метод к переменным, содержащим строку, возникнет ошибка:
$a = '' $a.Clear()
Строки не поддерживают метод .Clear():
InvalidOperation: Method invocation failed because [System.String] does not contain a method named 'Clear'.
Универсальным способом очистить переменную является командлет Clear-Variable:
Clear-Variable a
Обратите внимание, что при использовании командлета Clear-Variable перед именем переменной не нужно ставить символ «$» (знак доллара).
Этот способ полностью очистит переменную независимо от её типа.
Заключение
В этой заметке рассказывается о методах и свойствах переменных и синтаксисе их использования.
Как вы могли убедиться, иногда можно обратиться к свойству переменной напрямую и даже выполнить поиск или фильтрацию по определённым значениям свойств переменных не прибегая к дополнительным командлетам.