Как присвоить вывод командлета переменной и как использовать переменную с сохранённым выводом


Оглавление

  1. Как сохранить вывод командлета в переменную
  2. Как вывести содержимое переменной в Терминал
  3. Как обработать содержимое переменной с помощью командлета
  4. Как посчитать количество строк в переменной
  5. Как получить представление о содержимом переменной без вывода результатов целиком
  6. Как вывести только одно из свойств переменной
  7. Как проверить, содержит ли переменная искомое значение
  8. Как посчитать, сколько раз в объекте встречаются элементы с определённым свойством
  9. Как проверить тип переменной
  10. Как очистить значение переменной
  11. Заключение

Рассмотрим синтаксис 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 перед именем переменной не нужно ставить символ «$» (знак доллара).

Этот способ полностью очистит переменную независимо от её типа.

Заключение

В этой заметке рассказывается о методах и свойствах переменных и синтаксисе их использования.

Как вы могли убедиться, иногда можно обратиться к свойству переменной напрямую и даже выполнить поиск или фильтрацию по определённым значениям свойств переменных не прибегая к дополнительным командлетам.


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *