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
иend
process
блоки, как описано в 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\Share
E:
Команда использует 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
Примечание.
Первый блок скрипта всегда сопоставляется с блоком, последний блок сопоставляется с 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.
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 |
Входные данные
Вы можете передать любой объект в этот командлет.
Выходные данные
Этот командлет возвращает объекты, определяемые входными данными.
Примечания
Windows PowerShell включает следующие псевдонимы для ForEach-Object
:
%
foreach
Командлет ForEach-Object
работает так же, как оператор Foreach , за исключением того, что входные данные невозможно передать в инструкцию Foreach . Дополнительные сведения об инструкции Foreach см. в about_Foreach.
Начиная с PowerShell 4.0, Where
и ForEach
методы были добавлены для использования с коллекциями. Дополнительные сведения об этих новых методах см. здесь about_arrays
Связанные ссылки
PowerShell
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по