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


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.

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

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

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

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

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

    Get-Process | ForEach-Object ProcessName

    При использовании формата блока скрипта помимо использования блока скрипта, описывающего операции, выполняемые в каждом входном объекте, можно предоставить два дополнительных блока скриптов. Блок скрипта Begin, являющийся значением параметра Begin, запускается перед обработкой этого командлета первого входного объекта. Блок скрипта End, являющийся значением параметра End, запускается после обработки последнего входного объекта командлета.

Примеры

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

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

29.296875
55.466796875
12.140625

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

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

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

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

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

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

Эта команда получает 1000 последних событий из журнала событий системы и сохраняет их в переменной $Events. Затем он передает события командлету ForEach-Object.

Параметр Begin отображает текущую дату и время. Затем параметр процесса использует командлет для создания текстового файла с именем events.txt и хранения свойства сообщения каждого события в этом файле. Наконец, параметр End используется для отображения даты и времени после завершения обработки.

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

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

Эта команда изменяет значение записи реестра RemotePath во всех вложенных разделах в разделе HKCU:\Network key to uppercase text. Этот формат можно использовать для изменения формы или содержимого значения записи реестра.

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

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

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

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

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

Hello
Hello
Hello
Hello

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

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

Дополнительные сведения о $Null автоматической переменной см. в about_Automatic_Variables.

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

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

Эти команды получают значение свойства Path всех установленных модулей PowerShell. Они используют параметр MemberName для указания свойства пути модулей.

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

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

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

"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

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

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

Вторая команда использует параметр MemberName, чтобы указать метод split и параметр ArgumentName для идентификации точки (".") в качестве разделителя разбиения.

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

Выходные данные этих трех команд, показанные ниже, идентичны.

разделение — это лишь один из многих полезных методов строк. Чтобы просмотреть все свойства и методы строк, переведите строку в командлет Get-Member.

Параметры

-ArgumentList

Задает массив аргументов для вызова метода.

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

Тип:Object[]
Aliases:Args
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Begin

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

Тип:ScriptBlock
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Confirm

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

Тип:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-End

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

Тип:ScriptBlock
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-InputObject

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

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

Тип:PSObject
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-MemberName

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

Подстановочные знаки разрешены, но работают только в том случае, если результирующая строка разрешает уникальное значение. Например, если вы запускаете , а несколько элементов существуют с именем, содержащим строковое имя, например имя ProcessName и свойства Name, команда завершается ошибкой.

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

Тип:String
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:True

-Process

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

Тип:ScriptBlock[]
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-RemainingScripts

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

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

Тип:ScriptBlock[]
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-WhatIf

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

Тип:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

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

PSObject

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

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

PSObject

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

Примечания

  • Командлет работает так же, как оператор foreach , за исключением того, что невозможно передать входные данные в инструкцию Foreach. Дополнительные сведения об инструкции foreach см. в about_Foreach.
  • Начиная с PowerShell 4.0, были добавлены методы Where и ForEach для использования с коллекциями.
  • Дополнительные сведения об этих новых методах см. здесь about_arrays