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


ForEach-Object

Выполняет операцию для каждого из последовательности объектов ввода.

Синтаксис

ForEach-Object [-Process] <ScriptBlock[]> [-Begin <scriptblock>] [-End <scriptblock>] [-InputObject <psobject>] [<CommonParameters>]

Описание

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

Выполняемая операция описывается в блоке скрипта, который передается командлету в качестве значения параметра Process. Блок скрипта может содержать любой скрипт Windows PowerShell.

В пределах блока скрипта текущий объект ввода представлен переменной $_.

Кроме блока скрипта, который описывает операции, выполняемые над каждым объектом ввода, можно задать два дополнительных блока скрипта. Один из них, задаваемый значением параметра Begin, запускается перед обработкой первого объекта ввода. Другой, задаваемый значением параметра End, запускается после обработки последнего объекта ввода.

Результаты выполнения всех блоков скрипта, в том числе блоков Begin и End, передаются по конвейеру.

Параметры

-Begin <scriptblock>

Указывает блок скрипта, который будет запущен перед обработкой какого-либо объекта ввода.

Обязательно?

false

Позиция?

named

Значение по умолчанию

Принимать входные данные из конвейера?

false

Принимать подстановочные знаки?

false

-End <scriptblock>

Указывает блок скрипта, который будет запущен после обработки всех объектов ввода.

Обязательно?

false

Позиция?

named

Значение по умолчанию

Принимать входные данные из конвейера?

false

Принимать подстановочные знаки?

false

-InputObject <psobject>

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

Обязательно?

false

Позиция?

named

Значение по умолчанию

Принимать входные данные из конвейера?

true (ByValue)

Принимать подстановочные знаки?

false

-Process <ScriptBlock[]>

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

Обязательно?

true

Позиция?

1

Значение по умолчанию

Принимать входные данные из конвейера?

false

Принимать подстановочные знаки?

false

<CommonParameters>

Данный командлет поддерживает общие параметры -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer и -OutVariable. Дополнительные сведения см. в разделе about_Commonparameters.

Ввод и вывод

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

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

System.Management.Automation.PSObject

Любой объект можно передать командлету ForEach-Object по конвейеру.

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

System.Management.Automation.PSObject

Объекты, возвращаемые ForEach-Object, определяются путем ввода.

Пример 1

C:\PS>30000,56798,12432 | foreach-object -process {$_/1024}

Описание
-----------
Эта команда принимает массив целых чисел, делит каждое из них на 1024 и отображает результаты.





Пример 2

C:\PS>get-childitem C:\ | foreach-object -process { $_.length / 1024 }

Описание
-----------
Эта команда извлекает файлы и каталоги в корневом каталоге диска C:, а затем возвращает и отображает размер каждого из них. Для каталогов, для которых не удалось определить размеры файлов, отображаются нули.





Пример 3

C:\PS>$events = get-eventlog -logname system -newest 1000

C:\PS> $events | foreach-object -begin {get-date} -process {out-file -filepath events.txt -append -inputobject $_.message} -end {get-date}

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





Пример 4

C:\PS>get-itemproperty -path hkcu:\Network\* | foreach-object {set-itemproperty -path $_.pspath -name RemotePath -value $_.RemotePath.ToUpper();}

Описание
-----------
Эта команда изменяет регистр символов для всех значений записей реестра RemotePath во всех подразделах раздела HKEY_CURRENT_USER\Network на верхний. Можно использовать формат этой команды для изменения формы или содержания значения записи регистра.

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

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

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