* パイプライン入力 1 - ByValue [#h3a899b7]

** 概要 [#h7cbafb9]

 CommandletA | CommandletB

- PowerShellでパイプで値を渡す方法は2つある。ByValue と ByPropertyName。
- ByValueがデフォルトで、PowerShellはパイプからByValueな値がないか調べて、ない場合はByPropertyNameな値を調べる。どちらもない場合はエラーになる。
- ここではByValueについて説明する。

** ByValue 例1 [#n0c99ed5]

*** 例 [#g5f3e722]

 PS> "1.txt","2.txt","3.txt" | Invoke-Item
 
- この例ではカレントディレクトリに1.txtや2.txtというファイルがあって、それをInvoke-Itemに渡して、メモ帳などで開く場合を考える。

*** "1.txt","2.txt","3.txt" がどんな値を出力するかGet-Memberで調べる [#sacf4d4d]

 PS> "1.txt","2.txt","3.txt" | Get-Member
 
 TypeName: System.String

- 「String」であることがわかる。


*** Invoke-Itemがどんなパイプライン入力を受け取るかHelpで調べる [#oc919ad5]

 PS> help Invoke-Item -Full
 
 -Path <String[]>
     Specifies the path to the selected item.
 
     必須                         true
     位置                         0
     既定値                       None
     パイプライン入力を許可する   True (ByPropertyName, ByValue)
     ワイルドカード文字を許可する false

- 「-Path」が「ByValue」で「パイプライン入力を許可する True」なことが分かる。
- そして、-Pathが受け取るのは「String[]」。
- よって、Invoke-Itemは"1.txt","2.txt","3.txt"を受け取れ、このパイプ処理は正常に動作する。

** ByValue 例2 [#x3d6dcce]

*** 例 [#mc370f22]

 PS> Get-Process notepad* | Stop-Process

- この例ではメモ帳(notepad.exe)を起動している状態で、それをStop-Processで終了する場合を考える。


*** Get-Process がどんな値を出力するかGet-Memberで調べる [#e389470d]

 PS> Get-Process | gm

 TypeName: System.Diagnostics.Process

- 「Process」であることがわかる。

*** Stop-Processがどんなパイプライン入力を受け取るかHelpで調べる [#u04bc606]

 PS> help Stop-Process -full
 
 -InputObject <Process[]>
     Specifies the process objects to stop. Enter a variable that contains the objects, or type a command or expression that gets the objects.
 
     必須                         true
     位置                         0
     既定値                       None
     パイプライン入力を許可する   True (ByValue)
     ワイルドカード文字を許可する false

- Stop-ProcessがProcessをByValueで受け取ることがわかる。
- よって、このパイプ処理は正常に動作する。

** ByValue 例3 [#y3aaf0e8]

*** 例 [#rbe6d83a]

 PS> gc .\files.csv
  
 No,Filename
 1,a.txt
 2,b.txt
 3,c.txt

- files.csvというCSVファイルがあって、そこに書かれたa.txtやb.txtをInvoke-Itemに渡して、メモ帳などで開く場合を考える。

*** Import-Csvがどんな値を出力するかGet-Memberで調べる [#wb735cd3]

 PS> Import-Csv .\files.csv | gm
 
 TypeName: System.Management.Automation.PSCustomObject

- Import-CsvはPSCustomObjectを出力する。よって、このままではInvoke-Itemは受け取れない。


*** Import-Csvの出力からFilenameだけをselectしてみる [#s910d186]

 PS> Import-Csv .\files.csv | select Filename
  
 Filename
 --------
 a.txt
 b.txt
 c.txt
 
 PS> Import-Csv .\files.csv | select Filename | gm
 
 TypeName: Selected.System.Management.Automation.PSCustomObject

- select Filenameでファイル名だけ取り出せているように見えるが、Get-Memberで調べると、型はPSCustomObjectのまま。このままではInvoke-Itemは受け取れない。

*** select -ExpandPropertyでプロパティだけ取り出す [#qe0a61e7]

 PS> Import-Csv .\files.csv | select -ExpandProperty Filename
 
 a.txt
 b.txt
 c.txt
 
 PS> Import-Csv .\files.csv | select -ExpandProperty Filename | gm
 
 TypeName: System.String
 
 PS> Import-Csv .\files.csv | select -ExpandProperty Filename | Invoke-Item

- このような場合、select -ExpandPropertyを使う。すると、その出力はStringになる。
- これによって、このパイプ処理は正常に動作する。

** 参考 [#o2dd14f7]

- https://blogs.technet.microsoft.com/heyscriptingguy/2013/03/25/learn-about-using-powershell-value-binding-by-property-name/

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS