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 する方法が 2 つあります。

  • スクリプト ブロック。 スクリプト ブロックを使用して、操作を指定することができます。 スクリプト ブロック内で、変数を $_ 使用して現在のオブジェクトを表します。 スクリプト ブロックは、Process パラメーターの値です。 スクリプト ブロックには、任意の PowerShell スクリプトを含めることができます。

    たとえば、次のコマンドは、コンピューター上の各プロセスの ProcessName プロパティの値を取得します。

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

    ForEach-Objectは、beginabout_functionsで説明されているように、process,およびendブロックをサポートします。

    Note

    スクリプト ブロックは、呼び出し元のスコープで実行されます。 そのため、ブロックはそのスコープ内の変数にアクセスでき、コマンドレットの完了後にそのスコープに保持される新しい変数を作成できます。

  • Operation ステートメント。 また、自然言語に似た操作ステートメントを記述することもできます。 操作のステートメントを使用してプロパティの値を指定することも、メソッドを呼び出すこともできます。 操作のステートメントは、Windows PowerShell 3.0 で導入されました。

    たとえば、次のコマンドは、コンピューター上の各プロセスの ProcessName プロパティの値も取得します。

    Get-Process | ForEach-Object ProcessName

例 1: 配列内の整数を除算する

この例では、3 つの整数の配列を受け取り、それぞれの整数を 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 件の最新のイベントをテキスト ファイルに書き込みます。 現在の時刻は、イベントの処理の前後に表示されます。

$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}

Get-EventLog は、システム イベント ログから 1000 件の最新のイベントを取得し、変数に $Events 格納します。 $Events はコマンドレットに 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をマップする場合、RemotePath レジストリ値を > に\\Server\Share設定して E サブキーが作成HKCU:\Networkされます。

このコマンドでは、コマンドレットをGet-ItemProperty使用してネットワーク キーのすべてのサブキーを取得し、コマンドレットをSet-ItemProperty使用して各キーの RemotePath レジストリ エントリの値を変更します。 Set-ItemPropertyこのコマンドでは、パスはレジストリ キーの PSPath プロパティの値です。 これは、レジストリ エントリではなく、レジストリ キーを表す Microsoft .NET Framework オブジェクトのプロパティです。 このコマンドは、文字列 (REG_SZ) である RemotePath 値の ToUpper() メソッドを使用します。

各キーのプロパティを変更するため 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: プロパティ値を取得する

この例では、コマンドレットの MemberName パラメーターを使用して、インストールされているすべての PowerShell モジュールの Path プロパティの値をForEach-Object取得します。

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

2 番目のコマンドは、1 番目のコマンドと同等です。 コマンドレットのエイリアスをForeachForEach-Object使用し、MemberName パラメーターの名前を省略します(省略可能)。

このForEach-Objectコマンドレットは、プロパティ値の型を変更する Format コマンドレットやSelect-Objectコマンドレットとは異なり、型を変更せずに値を取得するため、プロパティ値を取得する場合に便利です。

例 7: モジュール名をコンポーネント名に分割する

この例では、2 つのドット区切りのモジュール名をコンポーネント名に分割する 3 つの方法を示します。 このコマンドは、文字列の Split メソッドを呼び出します。 3 つのコマンドは、別の構文を使用しますが、すべて同等であり、交換可能です。 出力は、3 つのケースすべてで同じです。

"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

最初のコマンドは、スクリプト ブロックと現在のオブジェクト演算子を含む従来の構文を使用します $_。 メソッドの指定にドット構文を使用し、区切り記号の引数を囲むためにかっこを使用します。

2 番目のコマンドでは、MemberName パラメーターを使用して Split メソッドを指定、ArgumentList パラメーターを使用してドット (.) を分割区切り記号として識別します。

3 番目のコマンドは、コマンドレットの Foreach エイリアスをForEach-Object使用し、MemberName パラメーターと ArgumentList パラメーターの名前を省略します(省略可能)。

例 8: 2 つのスクリプト ブロックで ForEach-Object を使用する

この例では、2 つのスクリプト ブロックを位置指定して渡します。 すべてのスクリプト ブロックは Process パラメーターにバインドされます。 ただし、これらは Begin パラメーターと Process パラメーターに渡されたかのように扱われます。

1..2 | ForEach-Object { 'begin' } { 'process' }

begin
process
process

例 9: 2 つ以上のスクリプト ブロックで ForEach-Object を使用する

この例では、4 つのスクリプト ブロックを位置指定して渡します。 すべてのスクリプト ブロックは Process パラメーターにバインドされます。 ただし、これらは Begin、ProcessEndの各パラメーターに渡されたかのように扱われます。

1..2 | ForEach-Object { 'begin' } { 'process A' }  { 'process B' }  { 'end' }

begin
process A
process B
process A
process B
end

Note

最初のスクリプト ブロックは常にブロックに 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

このコマンドレットが入力オブジェクトを処理する前に実行されるスクリプト ブロックを指定します。 このスクリプト ブロックは、パイプライン全体に対して 1 回だけ実行されます。 ブロックの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

このコマンドレットがすべての入力オブジェクトを処理した後に実行されるスクリプト ブロックを指定します。 このスクリプト ブロックは、パイプライン全体に対して 1 回だけ実行されます。 ブロックのend詳細については、about_Functionsを参照してください

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

入力オブジェクトを指定します。 ForEach-Object は、各入力オブジェクトに対してスクリプト ブロックまたは操作ステートメントを実行します。 オブジェクトが格納されている変数を入力するか、オブジェクトを取得するコマンドまたは式を入力します。

コマンドの結果ForEach-Objectパイプ処理する代わりに InputObject パラメーターをForEach-Object使用すると、InputObject 値は 1 つのオブジェクトとして扱われます。 これは、値がコマンド -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

取得するプロパティまたは呼び出すメソッドを指定します。

ワイルドカード文字は許可されますが、結果の文字列が一意の値に解決された場合にのみ機能します。 たとえば、実行Get-Process | ForEach -MemberName *Nameすると、ワイルドカード パターンが複数のメンバーと一致し、コマンドが失敗します。

このパラメーターは 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マップされます。 スクリプト ブロックが 2 つしかない場合は、2 番目のブロックがブロックに process マップされます。 3 つ以上のスクリプト ブロックがある場合、最初のスクリプト ブロックは常にブロックに 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

入力

PSObject

任意のオブジェクトをこのコマンドレットにパイプできます。

出力

PSObject

このコマンドレットは、入力によって決定されるオブジェクトを返します。

メモ

Windows PowerShell には、次のエイリアスが ForEach-Object含まれています。

  • %
  • foreach

このコマンドレットは ForEach-Object Foreach ステートメントとよく似ていますが、Foreach ステートメントに入力をパイプすることはできません。 Foreach ステートメントの詳細については、about_Foreachを参照してください

PowerShell 4.0 以降では、 Where コレクションで ForEach 使用するメソッドが追加されました。 これらの新しいメソッドの詳細については、about_arrays