about_Operators
Оператор — это элемент языка, который можно использовать в команде или выражении. PowerShell поддерживает несколько типов операторов, помогающих управлять значениями.
Арифметические операторы
Используйте арифметические операторы ( + , — , / * ,, % ) для вычисления значений в команде или выражении. С помощью этих операторов можно добавлять, вычитать, умножать или делить значения, а также вычислять остаток (остаток от деления) операции деления.
Оператор сложения объединяет элементы. Оператор умножения возвращает указанное количество копий каждого элемента. Арифметические операторы можно использовать для любого типа .NET, который их реализует, например: Int , String DateTime Hashtable ,, и.
Битовые операторы ( -band , -bor , -bxor , -bnot -shl ,, -shr ) управляют битовыми шаблонами в значениях.
Дополнительные сведения см. в разделе about_Arithmetic_Operators.
Операторы присваивания
Операторы присваивания ( = , += /= -= *= . %= ) используются для назначения, изменения или добавления значений переменным. Арифметические операторы можно объединять с оператором присваивания, чтобы присвоить результат арифметической операции переменной.
Дополнительные сведения см. в разделе about_Assignment_Operators.
Операторы сравнения
Используйте операторы сравнения ( -eq , -ne , -gt -lt -le . -ge ) для сравнения значений и условий теста. Например, можно сравнить два строковых значения, чтобы определить, равны ли они.
Операторы сравнения также включают операторы, которые находят или заменяют закономерности в тексте. Операторы ( -match , -notmatch , -replace ) используют регулярные выражения, а ( -like , -notlike ) используют подстановочные знаки * .
Операторы сравнения вложений определяют, отображается ли тестовое значение в наборе ссылок ( -in , -contains -notin ,, -notcontains ).
Операторы сравнения типов ( -is , -isnot ) определяют, относится ли объект к данному типу.
Дополнительные сведения см. в разделе about_Comparison_Operators.
Логические операторы
Используйте логические операторы ( -and , -or , -xor -not ,, ! ) для подключения условных операторов к одному сложному условию. Например, логический -and оператор можно использовать для создания фильтра объектов с двумя различными условиями.
Дополнительные сведения см. в разделе about_Logical_Operators.
Операторы перенаправления
Используйте операторы перенаправления ( > , >> 2> ,, 2>> и 2>&1 ) для отправки выходных данных команды или выражения в текстовый файл. Операторы перенаправления работают как командлет (без параметров), Out-File но они также позволяют перенаправлять вывод ошибок в указанные файлы. Можно также использовать Tee-Object командлет для перенаправления выходных данных.
Дополнительные сведения см. в разделе about_Redirection
Операторы Split и Join
-split Операторы and -join делят и объединяют подстроки. -split Оператор разделяет строку на подстроки. -join Оператор объединяет несколько строк в одну строку.
Дополнительные сведения см. в разделе about_Split и about_Join.
Операторы работы с типами
используйте операторы типа ( -is , -isnot , -as ), чтобы найти или изменить тип платформа .NET Framework объекта.
Дополнительные сведения см. в разделе about_Type_Operators.
Унарные операторы
Используйте унарные ++ операторы и — для увеличения или уменьшения значений и — для отрицания. Например, чтобы увеличить переменную $a с 9 на 10 , введите $a++ .
Дополнительные сведения см. в разделе about_Arithmetic_Operators.
Специальные операторы
Специальные операторы имеют особые варианты использования, которые не помещаются в любую другую группу операторов. Например, Специальные операторы позволяют выполнять команды, изменять тип данных значения или извлекать элементы из массива.
Оператор группирования ( )
Как и в других языках, (. ) служит для переопределения приоритета операторов в выражениях. Например: (1 + 2) / 3
Однако в PowerShell существуют дополнительные поведения.
(. ) позволяет разрешить выходные данные команды участвовать в выражении. Пример:
При использовании в качестве первого сегмента конвейера, заключение команды или выражения в круглые скобки неизменно приводит к перечислению результата выражения. Если скобки заключают команду в оболочку, она выполняется до завершения со всеми данными, собранными в памяти до отправки результатов через конвейер.
Оператор части выражения $( )
Возвращает результат одной или нескольких инструкций. Для одного результата возвращает скалярное значение. Для нескольких результатов возвращает массив. Используйте этот параметр, если требуется использовать выражение в другом выражении. Например, чтобы внедрить результаты команды в строковое выражение.
Оператор части выражения массива @( )
Возвращает результат одной или нескольких инструкций в виде массива. Результат всегда является массивом из 0 или более объектов.
Синтаксис литерала хэш-таблицы @<>
Как и часть выражения массива, этот синтаксис используется для объявления хэш-таблицы. Дополнительные сведения см. в разделе about_Hash_Tables.
Оператор Call &
Выполняет команду, сценарий или блок скрипта. Оператор Call, также известный как «оператор вызова», позволяет выполнять команды, которые хранятся в переменных и представляются строками или блоками сценариев. Оператор Call выполняется в дочерней области. Дополнительные сведения об областях см. в разделе about_Scopes.
В этом примере команда сохраняется в строке и выполняется с помощью оператора Call.
Оператор Call не выполняет синтаксический анализ строк. Это означает, что нельзя использовать параметры команды в строке при использовании оператора Call.
Командлет Invoke-Expression может выполнять код, который вызывает ошибки синтаксического анализа при использовании оператора Call.
Оператор Call можно использовать для выполнения скриптов, использующих их имена файлов. В следующем примере показано имя файла скрипта, содержащего пробелы. При попытке выполнить скрипт PowerShell вместо этого отображает содержимое строки в кавычках, содержащей имя файла. Оператор Call позволяет выполнить содержимое строки, содержащей имя файла.
Дополнительные сведения о блоках скриптов см. в разделе about_Script_Blocks.
Оператор Background &
Запускает конвейер перед в фоновом режиме в задании PowerShell. этот оператор действует аналогично оператору UNIX элемента управления амперсанд ( & ), который выполняет команду до ее асинхронного выполнения в качестве задания.
Этот оператор функционально эквивалентен Start-Job . По умолчанию оператор Background запускает задания в текущем рабочем каталоге вызывающего объекта, который запустил параллельные задачи. В следующем примере демонстрируется базовое использование оператора фонового задания.
Эта команда функционально эквивалентна следующему использованию Start-Job :
Как Start-Job и в & случае, оператор Background возвращает Job объект. Этот объект можно использовать с Receive-Job и Remove-Job , точно так же, как если бы вы использовали Start-Job для запуска задания.
& фоновый оператор также является признаком конца оператора, точно так же, как оператор UNIX элемента управления амперсанд ( & ). Это позволяет вызывать дополнительные команды после & фонового оператора. В следующем примере демонстрируется вызов дополнительных команд после & оператора Background.
Это эквивалентно следующему сценарию:
Если требуется выполнить несколько команд, каждая из которых находится в собственном фоновом процессе, но все они находятся на одной строке, просто поместите & их между и после каждой команды.
Дополнительные сведения о заданиях PowerShell см. в разделе about_Jobs.
Оператор CAST [ ]
Преобразует или ограничивает объекты указанным типом. Если не удается преобразовать объекты, PowerShell выдает ошибку.
Приведение также можно выполнить, если переменная назначена с помощью нотации приведения.
Запятая, оператор ,
Как бинарный оператор, запятая создает массив или добавляет к создаваемому массиву. В режиме выражения в качестве унарного оператора запятая создает массив только с одним элементом. Поместите запятую перед элементом.
Поскольку Write-Object предполагает аргумент, выражение должно быть заключено в круглые скобки.
Оператор "точка с точкой" .
Выполняет скрипт в текущей области, чтобы все функции, псевдонимы и переменные, создаваемые сценарием, добавлялись в текущую область, переопределяя существующие. Параметры, объявленные сценарием, становятся переменными. Параметры, для которых не было указано значение, становятся переменными без значения. Однако автоматическая переменная $args сохраняется.
За оператором «точка» следует пробел. Используйте пробел, чтобы отличить точку от символа точки ( . ), который представляет текущий каталог.
В следующем примере сценарий Sample.ps1 в текущем каталоге выполняется в текущей области.
Format, оператор -f
Форматирует строки с помощью метода Format строковых объектов. Введите строку формата слева от оператора и объекты, которые должны быть отформатированы с правой стороны оператора.
Если необходимо, чтобы фигурные скобки ( <> ) в форматируемой строке были заключены в квадратные скобки, их можно поэкранировать.
Дополнительные сведения см. в разделе метод String. Format и составное форматирование.
Оператор индекса [ ]
Выбирает объекты из индексированных коллекций, таких как массивы и хэш-таблицы. Индексы массива отсчитываются от нуля, поэтому первый объект индексируется как [0] . Для получения последних значений можно также использовать отрицательные индексы. Хэш-таблицы индексируются по значению ключа.
При наличии списка индексов Оператор Index возвращает список элементов, соответствующих этим индексам.
Если объект не является индексированной коллекцией, использование оператора index для доступа к первому элементу возвращает сам объект. Индексные значения за пределами первого элемента возвращают $null значение.
Конвейерный оператор |
Отправляет ("pipe") выходные данные команды, предшествующей ей, с помощью команды, следующей за ней. Если выходные данные содержат более одного объекта ("Коллекция"), оператор конвейера посылает объекты по одному за раз.
Операторы && цепочки конвейеров и ||
Условно выполняет правый конвейер в зависимости от успешности конвейера левой части.
Дополнительные сведения см. в разделе About_Pipeline_Chain_Operators.
Оператор Range ..
Представляет последовательные целые числа в массиве целых чисел с учетом верхней и нижней границ.
Можно также создавать диапазоны в обратных последовательностях.
Начиная с PowerShell 6 оператор Range работает с символами , а также с целыми числами.
Чтобы создать диапазон символов, заключите эти символы в кавычки.
Оператор доступа к членам .
Обращается к свойствам и методам объекта. Имя члена может быть выражением.
Запуск PowerShell 3,0 при использовании оператора для объекта коллекции списков, не имеющего члена, PowerShell автоматически перечисляет элементы в этой коллекции и использует оператор для каждого из них. Дополнительные сведения см. в разделе about_Member-Access_Enumeration.
Статический оператор члена ::
вызывает статические свойства и методы класса платформа .NET Framework. Чтобы найти статические свойства и методы объекта, используйте статический параметр Get-Member командлета. Имя члена может быть выражением.
Оператор Ternary ? <if-true> : <if-false>
Оператор ternary можно использовать в качестве замены if-else инструкции в простых условных случаях.
Дополнительные сведения см. в разделе about_If.
Оператор объединения со значением NULL ??
Оператор объединения со значением NULL ?? возвращает значение левого операнда, если оно не равно NULL. В противном случае он вычисляет правый операнд и возвращает результат. Оператор ?? не вычисляет правый операнд, если значение левого операнда отлично от NULL.
В следующем примере правый операнд не вычисляется.
Оператор присваивания, объединяющий значения NULL ??=
Оператор ??= присваивания, объединяющего значение null, присваивает значение правого операнда левому операнду только в том случае, если левый операнд принимает значение null. Оператор ??= не вычисляет правый операнд, если значение левого операнда отлично от NULL.
В следующем примере правый операнд не вычисляется.
Условные операторы ?. null и ?[]
Это экспериментальная функция. Дополнительные сведения см. в разделе about_Experimental_Features.
Условный оператор NULL применяет к операнду доступ к ?. элементу,, или к ?[] нему, только если этот операнд принимает значение, отличное от NULL; в противном случае возвращается значение null.
Так как в PowerShell символ ? может быть частью имени переменной, для использования этих операторов требуется формальное указание имени переменной. Поэтому имена переменных необходимо заключать в фигурные скобки <> , например $ , в том числе если имена содержат символ ? : $ .
В следующем примере возвращается значение пропнаме .
Следующий пример вернет значение null, не пытаясь получить доступ к имени члена пропнаме.
Аналогичным образом будет возвращено значение элемента.
Если операнд имеет значение null, доступ к элементу отсутствует, и возвращается значение null.
Так как в PowerShell символ ? может быть частью имени переменной, для использования этих операторов требуется формальное указание имени переменной. Поэтому имена переменных необходимо заключать в фигурные скобки <> , например $ , в том числе если имена содержат символ ? : $ .
Синтаксис $ <<name>>имени переменной не должен путать с $() оператором части выражения. Дополнительные сведения см. в разделе Имя переменной в about_Variables.
Что такое Windows PowerShell и с чем его едят? Часть 2: введение в язык программирования
Для PowerShell можно писать сценарии на интерпретируемом мультипарадигменном языке, в котором есть элементы классического процедурного, объектно-ориентированного и даже функционального программирования: условный переход, циклы, переменные, массивы, хэш-таблицы, классы, обработка ошибок, а также функции, командлеты и конвейеры. Предыдущая статья была посвящена основам работы в среде, а сейчас мы предлагаем вниманию читателей небольшой справочник для программистов.
Оглавление:
Писать код можно в любом текстовом редакторе или с использованием интегрированной среды разработки — проще всего взять Windows PowerShell ISE из комплекта поставки серверных операционных систем Microsoft. Нужно это только для достаточно сложных скриптов: короткие наборы команд проще выполнять в интерактивном режиме.
Комментарии
Использование комментариев считается частью хорошего стиля программирования наряду с правильными отступами и пробелами:
Переменные и их типы
Переменные в PowerShell — это именованные объекты. Их названия могут включать символ подчеркивания, а также буквы и числа. Перед именем всегда используется символ $, а чтобы объявить переменную, достаточно указать интерпретатору допустимое имя:

Для инициализации переменной (присвоения ей значения) применяется оператор присваивания (символ =):
Объявить переменную можно с указанием ее типа в квадратных скобках (оператор приведения типов) перед именем или значением:
Важно понимать, что переменные в PowerShell — это полноценные объекты (классы) со свойствами и методами, типы которых основаны на имеющихся в .NET Core. Перечислим основные:
| Тип (класс .NET) | Описание | Пример кода |
|---|---|---|
| [string] System.String |
строка Unicode | $test = «тест» $test = ‘тест’ |
| [char] System.Char |
символ Unicode (16 бит) | [char]$test = ‘c’ |
| [bool] System.Boolean |
булевский тип (логическое значение True или False) | [bool]$test = $true |
| [int] System.Int32 |
тридцатидвухразрядное целое число (32 бита) | [int]$test = 123456789 |
| [long] System.Int64 |
шестидесятичетырехразрядное целое число (64 бита) | [long]$test = 12345678910 |
| [single] System.Single |
число с плавающей точкой длиною в 32 бита | [single]$test = 12345.6789 |
| [double] System.Double |
число с плавающей точкой длиною в 64 бита (8 байт) | [double]$test = 123456789.101112 |
| [decimal] System.Decimal |
число с плавающей точкой длиною в 128 бит (обязательно указывать d на конце) | [decimal]$test = 12345.6789d |
| [DateTime] System.DateTime |
дата и время | $test = Get-Date |
| [array] System.Object[] |
массив, индекс элементов которого начинается с 0 | $test_array = 1, 2, «тест», 3, 4 |
| [hashtable] System.Collections.Hashtable |
хэш-таблицы — ассоциативные массивы с именованными ключами, построенные по принципу: @<ключ = «значение»> | $test_hashtable = @ |
PowerShell поддерживает неявное преобразование типов, кроме того тип переменной может меняться на ходу (например, при помощи оператора присваивания), если он не указан принудительно — в этом случае интерпретатор выдаст ошибку. Определить тип переменной из предыдущего примера можно при помощи вызова метода GetType():

Существует некоторое количество командлетов для управления переменными. Их список в удобной форме выводится с помощью команды:

Для просмотра объявленных переменных и их значений можно использовать специальный командлет:
Такой способ кажется чрезмерно громоздким, с переменными намного удобнее работать через операторы или обращаясь к их свойствам и методам напрямую. Тем не менее командлеты имеют право на существование, поскольку позволяют задать некоторые дополнительные параметры. Важно понимать, что пользовательские переменные определены только в рамках текущего сеанса. После закрытия консоли или завершения сценария они удаляются.
Системные переменные
Помимо объявленных пользователем существуют встроенные (системные) переменные, которые не удаляются после завершения текущего сеанса. Делятся они на два типа, при этом данные о состоянии PowerShell хранятся в автоматических переменных, которым нельзя самостоятельно присвоить произвольные значения. К их числу относится, например, $PWD:

Для хранения пользовательских настроек нужны переменные предпочтений, значения которых можно изменить. К примеру, с помощью $ErrorActionPreference задается реакция интерпретатора команд на возникновение некритических ошибок.
Вдобавок к операторам и командлетам для обращения к объявленным переменным существует псевдонакопитель Variable:. Работать с ним можно по аналогии с другими накопителями, а переменные в этом случае напоминают объекты файловой системы:

Области видимости
Для переменных в PowerShell существует понятие области видимости (Scope). Действие глобальной области (Global) распространяется на весь текущий сеанс — в нее входят, например, системные переменные. Локальные (Local) переменные доступны только в области, где они были определены: скажем внутри функции. Есть еще понятие области действия сценария (Script), но для команд скрипта она по сути является локальной. По умолчанию при объявлении переменных им задается локальная область действия, а чтобы это изменить, нужна специальная конструкция вида: $Global: переменная = значение.
Переменные окружения (среды)
Из PowerShell доступен еще один псевдонакопитель Env:, с помощью которого можно обратиться к переменным среды. При запуске оболочки они копируются из родительского процесса (т.е. из инициировавшей текущий сеанс программы) и обычно их первоначальные значения совпадают со значениями в панели управления. Для просмотра переменных окружения используется командлет Get-ChildItem или его псевдонимы (алиасы): ls и dir.

Эти переменные представляют собой последовательности байтов (или символов, если угодно), интерпретация которых зависит только от использующей их программы. Командлеты *-Variable с переменными среды не работают. Чтобы обратиться к ним, придется использовать префикс диска:

Арифметические операторы и операторы сравнения
| Оператор | Описание | Пример кода |
|---|---|---|
| -eq | Equal / Равно (аналог = или == в других языках) | $test = 100 $test -eq 123 |
| -ne | Not equal / Не равно (аналог <> или !=) | $test = 100 $test -ne 123 |
| -gt | Greater than / Больше (аналог >) | $test = 100 $test -gt 123 |
| -ge | Greater than or equal / Больше или равно (аналог >=) | $test = 100 $test -ge 123 |
| -lt | Less than / Меньше (аналог <) | $test = 100 $test -lt 123 |
| -le | Less than or equal / Меньше или равно (аналог <=) | $test = 100 $test -le 123 |
Существуют и другие подобные операторы, позволяющие, например, сравнивать строки с учетом символа подстановки или использовать регулярные выражения для поиска соответствия образцу. Их мы подробно рассмотрим в следующих статьях. Символы <, > и = для сравнения не используются, поскольку задействованы для других целей.
Операторы присваивания
Помимо самого распространенного оператора = существуют и другие операторы присваивания: +=, -=, *=, /= и %=. Они изменяют значение перед присвоением. Аналогично ведут себя унарные операторы ++ и —, которые увеличивают или уменьшают значение переменной — они тоже относятся к операторам присваивания.
Логические операторы
Для описания сложных условий одного только сравнения недостаточно. Записать любые логические выражения можно с помощью операторов: -and, -or, -xor, -not и. Работают они как и в других языках программирования, при этом можно использовать круглые скобки, чтобы задать порядок вычисления:
Условный переход
Операторы ветвления в PowerShell стандартные: IF(IF…ELSE, IF…ELSEIF…ELSE) и SWITCH. Рассмотрим их использование на примерах:
Циклы
В языке PowerShell есть несколько разновидностей циклов: WHILE, DO WHILE, DO UNTIL, FOR и FOREACH.
Цикл с предусловием работает, если/пока оно выполняется:
Циклы с постусловием отработают хотя бы один раз, потому что проверка условия производится после выполнения итерации. При этом DO WHILE работает, пока условие истинно, а DO UNTIL — пока оно ложно:
Количество итераций цикла FOR известно заранее:
В цикле FOREACH осуществляет перебор элементов массива или коллекции (хэш-таблицы):
Массивы
В переменных PowerShell хранятся не только единичные объекты (число, строка и т.д.), но и множественные. Самая простая разновидность таких переменных — массивы. Массив может состоять из нескольких элементов, из одного элемента или быть пустым, т.е. не содержать элементов. Для его объявления используется оператор @(), который понадобится нам в следующей статье — он очень важен для добавления в массив других массивов (создания многомерных массивов), передачи массивов в функции в качестве аргумента и тому подобных задач:
При инициализации массива его значения перечисляются через запятую (специальный оператор ,):
В большинстве случаев оператор @() можно опустить:
В этом случае массив из одного элемента инициализируется следующим образом
Для обращения к элементам массива используется начинающийся с нуля целочисленный индекс и оператор индекса (квадратные скобки):
Можно указать несколько индексов через запятую, в т.ч. повторяющихся:

Оператор .. (две точки — оператор диапазона) возвращает массив целых чисел на определенном верхней и нижней границей отрезке. Например, выражение 1..4 выводит массив из четырех элементов @(1, 2, 3, 4), а выражение 8..5 — массив @(8, 7, 6, 5).

С помощью оператора диапазона можно инициализировать массив ($test_array = 1..4) или получить срез (slice), т.е. последовательность элементов одного массива с индексами из другого. При этом отрицательное число -1 обозначает последний элемент массива, -2 — предпоследний и т.д.
Обратите внимание, что значения целочисленного массива могут быть больше максимального значения индекса массива с данными. В этом случае возвращаются все значения до последнего:
Если попытаться обратиться к единственному несуществующему элементу массива, возвращается значение $null.

В PowerShell массивы могут содержать элементы разных типов или быть строго типизированными:
Где свойство $test_array.count — количество элементов массива.
Пример создания строго типизированного массива:
Хэш-таблицы
Еще один базовый тип переменных в языке PowerShell — хэш-таблицы, которые также называют ассоциативными массивами. Hashtable похожи на JSON object и строятся по принципу ключ-значение. В отличие от обычных массивов, доступ к их элементам осуществляется по именованным ключам, которые являются свойствами объекта (также можно использовать оператор индекса — квадратные скобки).
Пустая хэш-таблица объявляется с помощью служебного символа @ и операторных скобок:
При объявлении можно сразу создать ключи и присвоить им значения:
Для добавления элемента в хэш-таблицу нужно присвоить ей еще несуществующий ключ или воспользоваться методом Add(). Если присваивание делается с существующим ключом, его значение изменится. Для удаления элемента из хэш-таблицы используется метод Remove().

Переменные этого типа можно передавать в качестве аргументов функциям и командлетам — в следующей статье мы изучим как это делается, а также рассмотрим еще один сходный тип — PSCustomObject.
Функции
В языке PowerShell есть все необходимые для процедурного программирования элементы, включая функции. Для их описания используется служебное слово Function, после которого требуется указать имя функции и заключенное в операторные скобки тело. При необходимости передать в функцию аргументы их можно указать сразу после имени в круглых скобках.
Функция всегда возвращает результат — это массив результатов всех ее стейтментов, если их более одного. Если стейтмент один, возвращается единственное значение соответствующего типа. Конструкция return $value добавляет элемент со значением $value к массиву результатов и прерывает выполнение statement list, а пустая функция возвращает $null.
Для примера создадим функцию возведения числа в квадрат:
Отметим, что в теле функции можно использовать любые объявленные до ее вызова переменные, а вызов функций в PowerShell может показаться непривычным: аргументы (если они есть) не заключаются в круглые скобки и разделяются пробелами.
Из-за способа передачи аргументов саму функцию иногда приходится заключать в скобки:

При описании функции можно присвоить аргументам значения по умолчанию:
Существует и другой синтаксис для описания аргументов функции, кроме того параметры могут считываться из конвейера — все это пригодится в следующей статье, когда мы будем рассматривать экспортируемые модули и создание собственных командлетов.
Обработка ошибок
В PowerShell существует механизм Try…Catch…Finally, позволяющий обрабатывать исключительные ситуации. В блок Try помещается код, в котором может возникнуть ошибка, а в блок Catch — ее обработчик. Если ошибки не было, он не выполняется. Блок Finally выполняется после блока Try вне зависимости от возникновения ошибки, а блоков Catch может быть несколько для исключений различных типов. Само исключение записывается в не требующую объявления переменную по умолчанию ($_) и может быть легко извлечено. В примере ниже мы реализуем защиту от ввода некорректного значения:

На этом рассмотрение основ программирования на языке PowerShell стоит закончить. В следующих статьях мы подробнее изучим работу с переменными разных типов, коллекции, регулярные выражения, создание функций, модулей и собственных командлетов, а также объектно-ориентированное программирование.
What does $_ mean in PowerShell?
I’ve seen the following a lot in PowerShell, but what does it do exactly?
![]()
![]()
7 Answers 7
This is the variable for the current value in the pipe line, which is called $PSItem in Powershell 3 and newer.
For example in the above code the %<> block is called for every value in the array. The $_ or $PSItem variable will contain the current value.
I think the easiest way to think about this variable like input parameter in lambda expression in C#. I.e. $_ is similar to x in x => Console.WriteLine(x) anonymous function in C#. Consider following examples:
And compare this with C# syntax using LINQ:
According to this website, it’s a reference to this , mostly in loops.
$_ (dollar underscore) ‘THIS’ token. Typically refers to the item inside a foreach loop. Task: Print all items in a collection. Solution. . | foreach
$_ is an alias for automatic variable $PSItem (introduced in PowerShell V3.0; Usage information found here) which represents the current item from the pipe.
PowerShell (v6.0) online documentation for automatic variables is here.
$_ is a variable created by the system usually inside block expressions that are referenced by cmdlets that are used with pipe such as Where-Object and ForEach-Object .
But it can be used also in other types of expressions, for example with Select-Object combined with expression properties. Get-ChildItem | Select-Object @
It can also be referenced by custom parameter validation, where a script block is used to validate a value. In this case the $_ represents the parameter value as received from the invocation.
The closest analogy to c# and java is the lamda expression. If you break down powershell to basics then everything is a script block including a script file a, functions and cmdlets. You can define your own parameters but in some occasions one is created by the system for you that represents the input item to process/evaluate. In those situations the automatic variable is $_ .