【ForEach-Object】PowerShellはループ中にメソッドやプロパティが使える?

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShell でループ処理中にメソッドやプロパティを使う方法】

について紹介します。

PowerShell 3.0 以降、ForEach-Object コマンドレットに ”MemberName” オプションが追加されました。

従来の構文とは違ったループ処理方法で入力元のメソッドプロパティを使用することができます。

ForEach-Object コマンドレットの基本的な使い方は、こちら↓をご参考ください

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/object/foreach-object/”]

 

MemberName オプションを使ったループ処理

ループ処理を行うコマンドレット

ForEach-Object

の使い方は以下をご覧ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-help/foreach-object-help/”]

【コマンドレット】

ForEach-Object

【オプション】

パターン1
[v2 まで] -Begin      <初期化スクリプトブロック{}>
-End       <終了スクリプトブロック{}>
-InputObject   <入力オブジェクト>
-Process     <適用スクリプトブロック{}>

[v3,v4,v5 以降] -Begin      <初期化スクリプトブロック{}>
-End       <終了スクリプトブロック{}>
-InputObject   <入力オブジェクト>
-Process     <適用スクリプトブロック{}>
-RemainingScripts <残りのスクリプトブロック{}>
-Confirm
-WhatIf

パターン2
-MemberName  <メンバー名>
-ArgumentList   <引数リスト>
-InputObject   <入力オブジェクト>
-Confirm
-WhatIf

【入力】

System.Management.Automation.PSObject

【出力】

System.Management.Automation.PSObject

【エイリアス】

ForEach
%

上にも書いたように、PowerShell 3.0 以降に ”-MemberName” が追加されています。

MemberName オプションを使用しないでメソッド・プロパティを呼び出す

従来の方法でメソッド・プロパティを呼び出すためには、パイプラインから渡された値を格納している自動変数”$_”と、メソッド・プロパティを参照する”. (ドット演算子)”を使用します。

今回用意するオブジェクトは、

$Array = @ ( 1 , “a” , [String]1 , 2.1)

$オブジェクト = @ ( 整数 , 文字列 , 文字列(文字列の数字) , 小数(浮動小数点数))

とします。また呼び出すメソッド・プロパティはタイプ(型)を返す「GetType」を使用します。

※使用できるメソッド・プロパティを確認する方法はこちら↓の記事をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/object/get-member/”]

それでは実際に MemberName オプションを使用しない場合の実行結果です。

PS C:\> #配列を用意
PS C:\> $ary = @(1 , "a" , [String]1 ,2.1 )

PS C:\> #各要素の型を調べる
PS C:\> $array | ForEach-Object -Process {$_.GetType()}

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType
True     True     String                                   System.Object
True     True     String                                   System.Object
True     True     Double                                   System.ValueType

ご覧のように”.(ドット演算子)”を使用することでメソッドを呼び出すことができました。

MemberName オプションでメソッド・プロパティを呼び出す

次に “-MemberName” を使用する場合です。

使い方は単純にメソッド・プロパティの名前を指定するだけです。実際に見てみましょう。

PS C:\> #配列を用意
PS C:\> $ary = @(1 , "a" , [String]1 ,2.1 )

PS C:\> #各要素の型を調べる
PS C:\> $array | ForEach-Object -MemberName GetType

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType
True     True     String                                   System.Object
True     True     String                                   System.Object
True     True     Double                                   System.ValueType

このようにメソッド・プロパティの名前を指定するだけです。

“-MemberName” を使う場合は、基本的にメソッド・プロパティを指定するだけなので、計算したり文字列を加えたりする操作を行うときには使用しません。

“-MemberName” を使用する場合と使用しない場合の手間はそれほど変わらないような気がするので使い分けのコツはそんなにない気がします…

MemberName オプション中のメソッドで引数を使用する場合

オブジェクトが使用できるメソッドの中には引数を使用できるものもあります。その場合はさらに、”-ArgumentList” オプションを使用します。

例えば、Equals メソッドを使用する場合です。このメソッドでは「引数に指定した値と一致するかどうか」を比較することができます。

<オブジェクト>.Equals(“<引数>”)

実際に確認してみましょう。

以下のように料理名を格納した配列に対し特定の料理名があるかどうか調べる場合などに使用します。

$Food = @( “ラーメン” , “つけ麺” , “担々麺” , “焼きそば” )

→”つけ麺”が格納されているかどうか調べる

以下が実行結果です。

PS C:\> #料理名が格納された配列
PS C:\> $Food = @("ラーメン" , "つけ麺" , "担々麺" , "焼きそば")

PS C:\> #"つけ麺"があるかどうか比較
PS C:\> $Food | ForEach-Object -MemberName Equals -ArgumentList "つけ麺"
False
True
False
False

2番目の要素に”つけ麺”を格納していたので$Food[1]がTrueを返しています。このように ”-ArgumentList” メソッドの引数を指定することができます。

まとめ

ループ処理中にメソッド・プロパティを呼び出す場合は、

パターン1
<コマンドレット> | ForEach-object -Process { $_.<メソッド・プロパティ>}

パターン2
<コマンドレット> | ForEach-object -MemberName <メソッド・プロパティ>

を使用する。

”-MemberName” のメソッドに引数を指定する場合は

-ArgumentList <引数>

を使用する。

コメントを残す

メールアドレスが公開されることはありません。