Home > Windows にまつわる e.t.c.

標準出力/テキストファイルをオブジェクトにする PowerShell フィルタ


PowerShell のオブジェクトハンドリングに慣れてくると、外部コマンドが出力する標準出力とか syslog とかのテキストファイルを都度解析して処理するのが面倒になります。

こんな時は、標準出力やテキストファイルをオブジェクトに変換するフィルターを書くと処理しやすくなります。

フィルターは、先頭から1行ずつ読んで $_ に格納するので、行に分解する foreach は不要です。

フィルタの出力(return)は、処理対象行を読み込むごとに1行出力するのがスタンダードパターンです。

疑似コードにしてみました。

filter StdOut2Object{
    ### 標準出力を変数に格納する処理
    # 標準出力は先頭から1行ずつ読み込まれ $_ に格納される
    # 処理する行の -match 条件とか
    #     変数分解するためのスプリット文字を指定して -split とか .Split したり
    #     余分な空白取り外すために .Trim したり


    ### 格納した変数をオブジェクトにセット
    $Return = New-Object PSObject | Select-Object AAAA, BBBB, CCCC
    $Return.AAAA = $AA
    $Return.BBBB = $BB
    $Return.CCCC = $CC

    return $Return
}

 

例えば、ipconfig.exe の出力から IPv4 アドレスをオブジェクトにするフィルタはこんな感じになります。

filter GetIPv4Address{
    if( $_ -match "IPv4" ){
        # 名前
        $tmp = $_.Split(".")
        $Name = ($Tmp[0]).Trim()

        # IPアドレス
        $tmp = $_.Split(":")
        $Address = ($Tmp[1]).Trim()

        # オブジェクトにする
        $Return = New-Object PSObject | Select-Object Name, Address
        $Return.Name = $Name
        $Return.Address = $Address

        return $Return
    }
}

 

実行するとこんな感じになります。

PS C:\> ipconfig | GetIPv4Address

Name                   Address
----                   -------
自動構成 IPv4 アドレス 169.254.168.17
IPv4 アドレス          192.168.33.86

 

関連情報

PowerShell で目的の文字列を抽出する
http://www.vwnet.jp/Windows/PowerShell/2017010401/SelectString.htm

 

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.