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
.
Если объект не является каталогом, блок скрипта получает имя файла, делит значение его свойства
Пример 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 отображает текущую дату и время.
Затем параметр процесса
Пример 4. Изменение значения раздела реестра
Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Эта команда изменяет значение записи реестра RemotePath во всех вложенных разделах в разделе HKCU:\Network key to uppercase text. Этот формат можно использовать для изменения формы или содержимого значения записи реестра.
Каждый подраздел в ключе сети
Команда использует командлет Set-ItemProperty
путь — это значение свойства PSPath раздела реестра.
Это свойство объекта Microsoft .NET Framework, представляющего раздел реестра, а не запись реестра.
Команда использует метод
Так как 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.
Они используют параметр
Вторая команда эквивалентна первой.
В нем используется псевдоним
Командлет
Пример 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 для идентификации точки (".") в качестве разделителя разбиения.
Третья команда использует псевдоним
Выходные данные этих трех команд, показанные ниже, идентичны.
разделение — это лишь один из многих полезных методов строк.
Чтобы просмотреть все свойства и методы строк, переведите строку в командлет 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
Указывает свойство для получения или вызова метода.
Подстановочные знаки разрешены, но работают только в том случае, если результирующая строка разрешает уникальное значение.
Например, если вы запускаете
Этот параметр появился в 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 |
Входные данные
Вы можете передать любой объект в этот командлет.
Выходные данные
Этот командлет возвращает объекты, определяемые входными данными.
Примечания
- Командлет
работает так же, как оператор foreach , за исключением того, что невозможно передать входные данные в инструкцию Foreach . Дополнительные сведения об инструкции foreachсм. в about_Foreach . - Начиная с PowerShell 4.0, были добавлены методы
Where
иForEach
для использования с коллекциями. - Дополнительные сведения об этих новых методах см. здесь about_arrays