Поделиться через


ForEach-Object

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

Синтаксис

ScriptBlockSet (по умолчанию)

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

PropertyAndMethodSet

ForEach-Object
    [-MemberName] <String>
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

Описание

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

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

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

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

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

    ForEach-Objectподдерживает блоки и beginprocess блокиend, как описано в about_Functions.

    Замечание

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

  • Упрощенный синтаксис. Используя упрощенный синтаксис, вы указываете свойство или имя метода объекта в конвейере. ForEach-Object возвращает значение свойства или метода для каждого объекта в конвейере.

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

    Get-Process | ForEach-Object ProcessName

    Упрощенный синтаксис появился в Windows PowerShell 3.0. Дополнительные сведения см. в about_Simplified_Syntax.

Примеры

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

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

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

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

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

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: с \\Server\Share, то в создается подключ HKCU:\Network E со значением реестра remotePath \\Server\Share значением .

Команда использует 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 псевдоним командлета ForEach-Object и исключает имена параметров 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

Замечание

Первый блок скрипта всегда сопоставляется с блоком begin, последний блок сопоставляется с блоком end, а два средних блока сопоставляются с блоком 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.

Свойства параметра

Тип:

Object[]

Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False
Aliases:Аргументы

Наборы параметров

PropertyAndMethodSet
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Begin

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

Свойства параметра

Тип:ScriptBlock
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

ScriptBlockSet
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Confirm

Запрашивает подтверждение перед запуском cmdlet.

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False
Aliases:cf

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-End

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

Свойства параметра

Тип:ScriptBlock
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

ScriptBlockSet
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-InputObject

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

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

Свойства параметра

Тип:PSObject
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:True
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-MemberName

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

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

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

Свойства параметра

Тип:String
Default value:None
Поддерживаются подстановочные знаки:True
DontShow:False

Наборы параметров

PropertyAndMethodSet
Position:0
Обязательно:True
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Process

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

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

Свойства параметра

Тип:

ScriptBlock[]

Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

ScriptBlockSet
Position:0
Обязательно:True
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-RemainingScripts

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

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

Свойства параметра

Тип:

ScriptBlock[]

Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

ScriptBlockSet
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-WhatIf

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False
Aliases:wi

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

CommonParameters

Этот командлет поддерживает общие параметры: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction и -WarningVariable. Дополнительные сведения см. в разделе about_CommonParameters.

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

PSObject

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

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

PSObject

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

Примечания

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

  • %
  • foreach

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

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