次の方法で共有


ForEach-Object

入力オブジェクトのコレクション内の各項目に対して操作を実行します。

構文

ScriptBlockSet (既定)

ForEach-Object
    [-Process] <ScriptBlock[]>
    [-InputObject <PSObject>]
    [-Begin <ScriptBlock>]
    [-End <ScriptBlock>]
    [-RemainingScripts <ScriptBlock[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

PropertyAndMethodSet

ForEach-Object
    [-MemberName] <String>
    [-InputObject <PSObject>]
    [-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は、about_Functions で説明されているように、beginprocess、およびend ブロックをサポートします。

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

  • 簡略化された構文。 簡略化された構文を使用して、パイプライン内のオブジェクトのプロパティまたはメソッド名を指定します。 ForEach-Object は、パイプライン内の各オブジェクトのプロパティまたはメソッドの値を返します。

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

    Get-Process | ForEach-Object ProcessName

    簡略化された構文は、Windows PowerShell 3.0 で導入されました。 詳細については、「 about_Simplified_Syntax」を参照してください。

例 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 件の最新のイベントをテキスト ファイルに書き込みます。 現在の時刻は、イベントの処理の前後に表示されます。

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: レジストリ キーの値を変更する

次の使用例は、 キーの下にあるすべてのサブキーの HKCU:\Network レジストリ エントリの値を大文字に変更します。

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

この形式を使用して、レジストリ エントリ値のフォームまたはコンテンツを変更できます。

ネットワーク キーの各サブキーは、サインオン時に再接続するマップされたネットワーク ドライブを表します。 RemotePath エントリには、接続されているドライブの UNC パスが含まれています。 たとえば、E: ドライブを\\Server\Shareにマップすると、RemotePath レジストリ値が HKCU:\Network に設定された E サブキーが\\Server\Shareに作成されます。

このコマンドでは、 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 モジュールの ForEach-Object プロパティの値を取得します。

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

2 番目のコマンドは、最初のコマンドと同じです。 Foreach コマンドレットのForEach-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 パラメーターにバインドされます。 ただし、これらは BeginProcess、End の各パラメーターに渡されたかのように扱われます。

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

最初のスクリプト ブロックは常に begin ブロックにマップされ、最後のブロックは end ブロックにマップされ、2 つの中間ブロックは 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 で導入されました。

パラメーターのプロパティ

型:

Object[]

規定値:None
ワイルドカードのサポート:False
DontShow:False
Aliases:引数

パラメーター セット

PropertyAndMethodSet
配置:Named
必須:False
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-Begin

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

パラメーターのプロパティ

型:ScriptBlock
規定値:None
ワイルドカードのサポート:False
DontShow:False

パラメーター セット

ScriptBlockSet
配置:Named
必須:False
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-Confirm

コマンドレットを実行する前に確認を求めるメッセージが表示されます。

パラメーターのプロパティ

型:SwitchParameter
規定値:False
ワイルドカードのサポート:False
DontShow:False
Aliases:cf

パラメーター セット

(All)
配置:Named
必須:False
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-End

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

パラメーターのプロパティ

型:ScriptBlock
規定値:None
ワイルドカードのサポート:False
DontShow:False

パラメーター セット

ScriptBlockSet
配置:Named
必須:False
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-InputObject

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

ForEach-Object パラメーターを使用する場合、コマンドの結果をForEach-Objectにパイプするのではなく、InputObject 値は 1 つのオブジェクトとして扱われます。 これは、値がコマンドの結果であるコレクション (-InputObject (Get-Process)など) の場合でも当てはまります。 InputObject は、配列またはオブジェクトのコレクションから個々のプロパティを返すことはできません。そのため、定義されたプロパティに特定の値を持つオブジェクトのオブジェクトのコレクションに対して操作を実行するためにForEach-Objectを使用する場合は、このトピックの例に示すように、パイプラインでForEach-Objectを使用することをお勧めします。

パラメーターのプロパティ

型:PSObject
規定値:None
ワイルドカードのサポート:False
DontShow:False

パラメーター セット

(All)
配置:Named
必須:False
パイプラインからの値:True
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-MemberName

取得するメンバー プロパティの名前または呼び出すメンバー メソッドを指定します。 メンバーは、静的メンバーではなく、インスタンス メンバーである必要があります。

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

このパラメーターは、Windows PowerShell 3.0 で導入されました。

パラメーターのプロパティ

型:String
規定値:None
ワイルドカードのサポート:True
DontShow:False

パラメーター セット

PropertyAndMethodSet
配置:0
必須:True
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-Process

各入力オブジェクトに対して実行される操作を指定します。 このスクリプト ブロックは、パイプライン内のすべてのオブジェクトに対して実行されます。 process ブロックの詳細については、「about_Functions」を参照してください。

Process パラメーターに複数のスクリプト ブロックを指定すると、最初のスクリプト ブロックは常に begin ブロックにマップされます。 スクリプト ブロックが 2 つしかない場合、2 つ目のブロックは process ブロックにマップされます。 3 つ以上のスクリプト ブロックがある場合、最初のスクリプト ブロックは常に begin ブロックにマップされ、最後のブロックは end ブロックにマップされ、中央のブロックは process ブロックにマップされます。

パラメーターのプロパティ

型:

ScriptBlock[]

規定値:None
ワイルドカードのサポート:False
DontShow:False

パラメーター セット

ScriptBlockSet
配置:0
必須:True
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-RemainingScripts

Process パラメーターによって取得されないすべてのスクリプト ブロックを指定します。

このパラメーターは、Windows PowerShell 3.0 で導入されました。

パラメーターのプロパティ

型:

ScriptBlock[]

規定値:None
ワイルドカードのサポート:False
DontShow:False

パラメーター セット

ScriptBlockSet
配置:Named
必須:False
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

-WhatIf

コマンドレットを実行した場合の動作を示します。 コマンドレットは実行されません。

パラメーターのプロパティ

型:SwitchParameter
規定値:False
ワイルドカードのサポート:False
DontShow:False
Aliases:ウィスコンシン

パラメーター セット

(All)
配置:Named
必須:False
パイプラインからの値:False
プロパティ名別のパイプラインからの値:False
残りの引数からの値:False

CommonParameters

このコマンドレットでは、一般的なパラメーター -Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction、-WarningVariable の各パラメーターがサポートされています。 詳細については、about_CommonParametersを参照してください。

入力

PSObject

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

出力

PSObject

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

メモ

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

  • %
  • foreach

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

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