ForEach-Object

Выполняет операцию для каждого элемента в коллекции входных объектов.

Синтаксис

ForEach-Object
            [-InputObject <PSObject>]
            [-Begin <ScriptBlock>]
            [-Process] <ScriptBlock[]>
            [-End <ScriptBlock>]
            [-RemainingScripts <ScriptBlock[]>]
            [-WhatIf]
            [-Confirm]
            [<CommonParameters>]
ForEach-Object
            [-InputObject <PSObject>]
            [-MemberName] <String>
            [-ArgumentList <Object[]>]
            [-WhatIf]
            [-Confirm]
            [<CommonParameters>]

Описание

Командлет ForEach-Object выполняет операцию по каждому элементу в коллекции входных объектов. Входные объекты можно передать в командлет или указать с помощью параметра InputObject .

Начиная с Windows PowerShell 3.0, существует два разных способа создания ForEach-Object команды.

  • Блок скрипта. Можно использовать блок скрипта, чтобы указать операцию. В блоке скрипта используйте $_ переменную для представления текущего объекта. Блок скрипта — это значение параметра Process . Блок скрипта может содержать любой скрипт PowerShell.

    Например, следующая команда получает значение свойства ProcessName каждого процесса на компьютере.

    Get-Process | ForEach-Object {$_.ProcessName}

    ForEach-Objectподдерживает блоки beginи endprocessблоки, как описано в about_functions.

    Примечание.

    Блоки скрипта выполняются в область вызывающего абонента. Поэтому блоки имеют доступ к переменным в этом область и могут создавать новые переменные, которые сохраняются в этом область после завершения командлета.

  • Оператор операции. Вы также можете написать инструкцию операции, которая гораздо больше похожа на естественный язык. С помощью инструкции операции можно указать значение свойства или вызвать метод. Инструкции операций появились в Windows PowerShell 3.0.

    Например, следующая команда также получает значение свойства ProcessName каждого процесса на компьютере.

    Get-Process | ForEach-Object ProcessName

Примеры

Пример 1. Разделение целых чисел в массиве

Этот пример принимает массив из трех целых чисел и делит каждый из них на 1024.

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}

29.296875
55.466796875
12.140625

Пример 2. Получение длины всех файлов в каталоге

В этом примере файлы и каталоги обрабатываются в каталоге $PSHOMEустановки PowerShell.

Get-ChildItem $PSHOME |
  ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

Если объект не является каталогом, блок скрипта получает имя файла, делит значение свойства Length на 1024 и добавляет пробел (""), чтобы отделить его от следующей записи. Командлет использует свойство PSISContainer для определения того, является ли объект каталогом.

Пример 3. Работа с последними событиями системы

В этом примере записывается 1000 последних событий из журнала событий системы в текстовый файл. Текущее время отображается до и после обработки событий.

Get-EventLog -LogName System -Newest 1000 |
    ForEach-Object -Begin {Get-Date} -Process {
        Out-File -FilePath Events.txt -Append -InputObject $_.Message
    } -End {Get-Date}

Get-EventLog получает 1000 последних событий из журнала событий системы и передает их командлету ForEach-Object . Параметр Begin отображает текущую дату и время. Затем параметр Process использует Out-File командлет для создания текстового файла с именем events.txt и хранения свойства сообщения каждого из событий в этом файле. Последний параметр End используется для отображения даты и времени после завершения обработки.

Пример 4. Изменение значения раздела реестра

В этом примере значение записи реестра RemotePath во всех вложенных разделах под HKCU:\Network ключом изменяется на текст верхнего регистра.

Get-ItemProperty -Path HKCU:\Network\* |
  ForEach-Object {
    Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
  }

Этот формат можно использовать для изменения формы или содержимого раздела реестра.

Каждый подраздел в сетевом ключе представляет сопоставленный сетевой диск, который повторно подключается при входе. Запись RemotePath содержит UNC-путь подключенного диска. Например, при сопоставлении диска с подразделом E создается в HKCU:\Network качестве значения \\Server\Shareреестра RemotePath.\\Server\ShareE:

Команда использует Get-ItemProperty командлет для получения всех вложенных ключей ключа сети и Set-ItemProperty командлета, чтобы изменить значение записи реестра RemotePath в каждом разделе. В команде Set-ItemProperty путь — это значение свойства PSPath раздела реестра. Это свойство объекта Microsoft платформа .NET Framework, представляющего раздел реестра, а не запись реестра. Команда использует метод ToUpper() значения RemotePath, который является строковым REG_SZ.

Так как Set-ItemProperty изменяется свойство каждого ключа, ForEach-Object командлет требуется для доступа к свойству.

Пример 5. Использование автоматической переменной $null

В этом примере показан эффект подключения автоматической $null переменной к командлету ForEach-Object .

1, 2, $null, 4 | ForEach-Object {"Hello"}

Hello
Hello
Hello
Hello

Так как PowerShell обрабатывается $null как явный заполнитель, ForEach-Object командлет создает значение для $null других объектов, которые передаются в него.

Пример 6. Получение значений свойств

В этом примере возвращается значение свойства Path для всех установленных модулей PowerShell с помощью параметра MemberName командлета ForEach-Object .

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

Вторая команда эквивалента первой. Он использует Foreach псевдоним командлета ForEach-Object и пропускает имя параметра MemberName , который является необязательным.

Командлет ForEach-Object полезен для получения значений свойств, так как он получает значение без изменения типа, в отличие от командлетов Format или Select-Object командлета, которые изменяют тип значения свойства.

Пример 7. Разделение имен модулей на имена компонентов

В этом примере показано три способа разделения двух точечного модуля на их имена компонентов. Команды вызывают метод Split строк. Три команды используют различный синтаксис, но они эквивалентны и являются взаимозаменяемыми. Выходные данные одинаковы для всех трех случаев.

"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
    ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
    ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
    Foreach Split "."

Microsoft
PowerShell
Core
Microsoft
PowerShell
Host

Первая команда использует традиционный синтаксис, который включает блок скрипта и текущий оператор $_объекта. Точечный синтаксис применяется для указания метода, а аргумент разделителя заключается в круглые скобки.

Вторая команда использует параметр MemberName, чтобы указать метод Split и параметр ArgumentList, чтобы определить точку (.) в качестве разделителя разделения.

Третья команда использует псевдоним ForEach-Object foreach для командлета и исключает имена параметров MemberName и ArgumentList, которые являются необязательными.

Пример 8. Использование ForEach-Object с двумя блоками скриптов

В этом примере мы передаваем два блока скрипта позиционально. Все блоки скрипта привязываются к параметру Process . Однако они обрабатываются так, как если бы они были переданы параметрам Begin и Process .

1..2 | ForEach-Object { 'begin' } { 'process' }

begin
process
process

Пример 9. Использование forEach-Object с более чем двумя блоками скриптов

В этом примере мы передаваем четыре блока скрипта позиционально. Все блоки скрипта привязываются к параметру Process . Однако они обрабатываются так, как если бы они были переданы в параметры Begin, Process и End .

1..2 | ForEach-Object { 'begin' } { 'process A' }  { 'process B' }  { 'end' }

begin
process A
process B
process A
process B
end

Примечание.

Первый блок скрипта всегда сопоставляется с блоком, последний блок сопоставляется с beginend блоком, а два средних блока сопоставляются с блоком process .

Пример 10. Запуск нескольких блоков скриптов для каждого элемента конвейера

Как показано в предыдущем примере, несколько блоков скриптов, переданных с помощью параметра Process , сопоставляются с параметрами Begin и End . Чтобы избежать этого сопоставления, необходимо указать явные значения для параметров Begin и End .

1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null

one
two
three
one
two
three

Параметры

-ArgumentList

Задает массив аргументов для вызова метода. Дополнительные сведения о поведении ArgumentList см. в about_Splatting.

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Begin

Задает блок скрипта, который выполняется перед обработкой входных объектов этого командлета. Этот блок скрипта выполняется только один раз для всего конвейера. Дополнительные сведения о блоке begin см. в about_Functions.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Confirm

Запрос подтверждения перед выполнением командлета.

Type:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-End

Указывает блок скрипта, который выполняется после этого командлета, обрабатывает все входные объекты. Этот блок скрипта выполняется только один раз для всего конвейера. Дополнительные сведения о блоке end см. в about_Functions.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Задает входные объекты. ForEach-Object запускает блок скрипта или инструкцию операции для каждого входного объекта. Введите переменную, которая содержит объекты, или команду или выражение, которое возвращает объекты.

При использовании параметра InputObject вместо ForEach-Objectрезультатов ForEach-Objectкоманды piping в значение InputObject рассматривается как один объект. Это верно, даже если значение является коллекцией, которая является результатом команды, например -InputObject (Get-Process). Так как InputObject не может возвращать отдельные свойства из массива или коллекции объектов, рекомендуется ForEach-Object выполнять операции с коллекцией объектов для тех объектов, которые имеют определенные значения в определенных свойствах, которые используются ForEach-Object в конвейере, как показано в примерах в этом разделе.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-MemberName

Указывает имя свойства члена, которое нужно получить или вызвать метод-член. Элементы должны быть элементами экземпляра, а не статическими.

Wild карта символы разрешены, но работают только в том случае, если результирующая строка разрешается в уникальное значение. Например, если вы выполняетеGet-Process | ForEach -MemberName *Name, шаблон wild карта соответствует нескольким членам, что приводит к сбою команды.

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:True

-Process

Указывает операцию, выполняемую для каждого входного объекта. Этот блок скрипта выполняется для каждого объекта в конвейере. Дополнительные сведения о блоке process см. в about_Functions.

При предоставлении нескольких блоков скриптов параметру Process первый блок скрипта всегда сопоставляется с блоком begin . Если существует только два блока скрипта, второй блок сопоставляется с блоком process . Если существует три или более блоков скриптов, первый блок скрипта всегда сопоставляется с begin блоком, последний блок сопоставляется с end блоком, а средние блоки сопоставляются с блоком process .

Type:ScriptBlock[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-RemainingScripts

Указывает все блоки скриптов, которые не принимаются параметром Process .

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:ScriptBlock[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WhatIf

Показывает, что произойдет при запуске командлета. Командлет не выполняется.

Type:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Входные данные

PSObject

Вы можете передать любой объект в этот командлет.

Выходные данные

PSObject

Этот командлет возвращает объекты, определяемые входными данными.

Примечания

Windows PowerShell включает следующие псевдонимы для ForEach-Object:

  • %
  • foreach

Командлет ForEach-Object работает так же, как оператор Foreach , за исключением того, что входные данные невозможно передать в инструкцию Foreach . Дополнительные сведения об инструкции Foreach см. в about_Foreach.

Начиная с PowerShell 4.0, Where и ForEach методы были добавлены для использования с коллекциями. Дополнительные сведения об этих новых методах см. здесь about_arrays