パイプライン入力 1 - ByValue

概要

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

ByValue 例1

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

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

PS> "1.txt","2.txt","3.txt" | Get-Member

TypeName: System.String
  • 「String」であることがわかる。

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

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

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

Get-Process がどんな値を出力するかGet-Memberで調べる

PS> Get-Process | gm
TypeName: System.Diagnostics.Process
  • 「Process」であることがわかる。

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

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

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で調べる

PS> Import-Csv .\files.csv | gm

TypeName: System.Management.Automation.PSCustomObject
  • Import-CsvはPSCustomObjectを出力する。よって、このままではInvoke-Itemは受け取れない。

Import-Csvの出力からFilenameだけをselectしてみる

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でプロパティだけ取り出す

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になる。
  • これによって、このパイプ処理は正常に動作する。

参考


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

Last-modified: 2018-07-10 (火) 03:15:41 (126d)