PowerShellでのデータの出力と取り込み
はじめに
PowerShellでは、実行した処理の内容をファイルに出力することができます。処理内容をただテキストに出力するのではなく、CSVやJSON、XMLのような、データとして処理できる形での出力も可能です。出力したファイルを再度、PowerShellに活用することもできます。そのようなデータの出力や取り込みの仕方を紹介します。
テキストファイルの扱い
Unix系のコマンドではリダイレクトという機能があります。">"や">>"を利用して、コマンドの実行結果をテキストファイルに出力できる機能です。PowerShellでも同様のことができます。
リダイレクトについて
リダイレクトについては、以下のページに詳細が書かれています。
PowerShellのリダイレクトは、Unixとほぼ同等の方法で利用できます。PowerShellでは、コマンドレットを実行するとオブジェクトが返されますが、リダイレクトで出力される内容は、オブジェクトではなく場面に表示される内容の文字列です。
ここでは動きを分かり易くするため、PowerShellでプロンプトに文字列を出力する時に利用するコマンドレットWrite-Outputを使って挙動を説明します。
> Write-Output "Test" > Test.txt # Test.txtが作成され、そこに”Test”と出力される。
リダイレクトを使うと、Unixのコマンドと同様に、Test.txtにTestと書き込まれます。もし、ファイルが存在しない場合、Text.txtというファイルが作成され、そこにTestと書き込まれます。ファイルが存在した場合は、既存の内容が全て上書きされ、Testと書き込まれます。
もし、上書ではなく追記をしたい場合は、リダイレクトに**>>**を使います。
> Write-Output "Test" >> Test.txt # Test.txtが存在した場合、そこに”Test”と追記される。
ファイルが存在しない場合は同様鵜にファイルが作成されますが、存在する場合はファイルの最後にTestと追記されます。
テキストファイルの読み込み
PowerShellでのテキストの読み込みは、Get-Content でテキストファイルを開いて、出力を変数に保存したりパイプに通して利用します。Get-Contentで読み込んだテキストは、改行ごとに区切られた配列として読み込まれます。
テキストファイルの内容をそのままの形で読み込みたい時、オプション -Raw を付けます。-Rawを付けて読み込んだテキストは、改行コードを含む文字列として読み込まれます。必要に応じて使い分けてください。
-Encodingのオプションを利用すれば、読み込むテキストファイルのエンコードを指定することができます。利用できるエンコードは以下の通りです。-Encoding のオプションを指定して、Ctrl + Space の補完で一覧を表示できます。
> Get-Content -Encoding ansi
ansi bigendianunicode oem utf7 utf8BOM utf32
ascii bigendianutf32 unicode utf8 utf8NoBOM
CSVでの出力と取り込み
PowerShellは標準でCSVの取り込みと出力に対応しています。Get-Commandで標準で利用できるCSV関連のコマンドを調べると以下のようになります。
> Get-Command -Name *CSV* -Module Microsoft.PowerShell.Utility
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet ConvertFrom-Csv 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet ConvertTo-Csv 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Export-Csv 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-Csv 7.0.0.0 Microsoft.PowerShell.Utility
CSVのインポート
PowerShellでCSVのデータを取り込むにはImport-Csv、もしくはConvertFrom-Csvのコマンドレットを利用します。この二つのコマンドレットの違いは、Import-Csvのヘルプによると、Import-Csvがファイルから取り込むのと、ConvertFrom-Csvが文字列から取り込むという差があるそうです。それ以外の挙動は同じとのことです。
取り込まれたデータはPSObjectに変換され、他のコマンドレットの出力と同じように処理することができます。
Import-CSVは、以下のようなパターンで使用することが多いです。
# 変数に結果を保存する場合
>$Test = Import-Csv <CSVファイルのパス>
# 変数に結果を保存する場合
>Import-Csv <CSVファイルのパス> | <後続処理をするコマンドレット>
Import-CSVを実行するとPSオブジェクトが出力されます。そのまま実行すると、PSObjectの内容がプロンプトに出力されて処理が終了します。変数にPSObjectを保存したり、パイプで繋いで別のコマンドレットに出力を渡して、出力したPSObjectを利用します。
コマンドレットにそのままCSVのファイルのパスを指定すると、-Pathのオプションにファイルパスを指定したときと同じ処理がされます。もし、tab区切りのTSVの場合は、-Delimiterのオプションを使用して以下のようにコマンドレットを実行します。
> Import-Csv <CSVのファイルパス> -Delimiter "`t"
-Encodingのオプションを指定すれば読み込むCSVのエンコードを指定することができます。利用できるエンコードの種類は以下の通りです。
> Import-Csv -Encoding ansi
ansi bigendianunicode oem utf7 utf8BOM utf32
ascii bigendianutf32 unicode utf8 utf8NoBOM
CSVへのエクスポート
PowerShellでCSVのデータを出力にはExport-Csv、もしくはConvertTo-Csvのコマンドレットを利用します。この二つのコマンドレットの違いは、Export-Csvのヘルプによると、Export-Csvがファイルに出力するのと、ConvertFrom-Csvが文字列で出力するという差があるそうです。それ以外の挙動は同じとのことです。
これらのコマンドレットで、PSObjectのデータをCSVに出力して、Excelなどのソフトウェアで活用したり、別のソフトウェアのデータのインポートに対応することができます。
Export-CSVの使い方は以下のようになります。
> $Ser | Export-CSV <エクスポートするCSVファイルのパス>
CSVのファイルパスにファイルが存在しない場合、新たにファイルを作成して、そこにデータを保存します。もし、ファイルが存在した場合は、内容を全部消去してデータを保存します。 -Append のオプションを付けると出力をファイルに追記していきます。
Export-CSVの挙動は、PoerShellのバージョンによって若干異なる部分があります。
PowerShellのVer5(Windowsの標準でインストールされているPowerShell)では、出力されたCSVにTypeInformationという情報がCSVファイルの先頭の行に出力されます。この情報を省くには、IncludeTypeInformationのオプションを付けます。
Version7から、この情報が付加されないくなりました。この情報を付加する場合、-IncludeTypeInformationのオプションを付けます。他にも、InputObjectのオプションがVersion7では廃止されていたりします。
-Delimiter や -Encoding のオプションは、Import-CSVとほぼ同様に利用することができます。
JSONでの出力と取り込み
PoewrShellではJSON形式のデータの取り込みと出力に標準で対応しています。Get-Commandで標準で利用できるJSON関連のコマンドを調べると以下のようになります。
> Get-Command -Name *JSON* -Module Microsoft.PowerShell.Utility
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet ConvertFrom-Json 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet ConvertTo-Json 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Test-Json 7.0.0.0 Microsoft.PowerShell.Utility
CSVに有ったような、ファイルに出力するコマンドレットとファイルから直接読み取るコマンドレットがありません。JSONの出力や取り込みは、文字列のデータを介して行います。
JSONのデータを編集したい場合は、一度 ConvertFrom-Json でデータをPSObjectの形に変換して取り込みます。取り込んだデータを編集して、ConvertTo-Json でデータを出力します。
JSONからの入力
ConvertFrom-Json の公式ヘルプはこちらになります。
JSONの女児列をパイプを通してPSObjectに変換する方法と、JSONの文字列を引数に指定する方法の二通りがあります。
# $json にはJSONで記述されたデータの文字列が入っています。
> $json | ConvertFrom-Json
# パイプを通してPSObjectに取り込む方法
> ConvertFrom-Json $json
# 引数にJSONの文字列を指定する方法
実行すると、変換されたPSObjectの内容が出力されます。出力されたPSObjectは、パイプを通したり変数に結果を保存して利用します。オプションに**-Depth**を付けることで、読み取るJSONのデータの何階層まで読み込むかをしていすることもでます。
JSONへの出力
ConvertTo-Json の公式ヘルプはこちらになります。
PSオブジェクトをパイプを通してJSON変換する方法と、PSObjectを引数に指定してJSONに変換する方法の二通りがあります。
# $PSO にはPSObjectが入っています。
> $PSO | ConvertTo-Json
# パイプを通してJSONに変換する方法
> ConvertToJson jPSO
# 引数にPSObjectを指定してJSONに変換する方法
JSONは文字列として出力されます。ファイルに保存する場合は、リダイレクトで出力先のファイルを指定するなど、別途、テキストに書きだすための処理を記述する必要があります。
CliXMLについて
PowerShellでは、PSObjectをXMLのファイルに出力して保存することができます。この保存したXMLのファイルをコマンドレットで取り込むと、出力したものと同じPSObjectをインポートできます。
PowerShellのヘルプでは、CliXMLを「シリアル化されたオブジェクトを共通言語インフラストラクチャ (CLI) XML ファイル」と表現しています。他の仕組みで活用するというより、PowerShellのデータの保存手段として利用されているようです。
CliXMLファイルをエクスポートする
CliXMLファイルにオブジェクトをエクスポートするには、Export-Clixmlのコマンドレットを利用します。公式ヘルプはこちらになります。
Export-Clixmlで出力するファイルを指定して、変換するPSObjectをパイプで渡します。また、-InputObject のオプションで、エクスポートするPSObjectを指定することもできます。
> Get-Service | Export-Clixml -Path .\sample.xml
# Get-Serviceの結果をデータとしてSample.xmlに保存する。
> $Service = Get-Service
> Export-Clixml -Path .\sample.xml -InputObject $Service
# $Service の内容をsample.xmlに保存する。
-Depth で数字を指定すると、PSObjectのどの階層までエクスポートするのか指定することもできます。
CliXMLファイルをインポートする
Export-Clixml でエクスポートしたCliXMLのファイルを、Imporrt-CliXML のコマンドレットでインポートします。公式ヘルプはこちらになります。
使い方は簡単で、事前にエクスポートされたCliXMLファイルを指定してImport-CliXMLのコマンドレットを実行するだけです。インポートしたCliXMLファイルがオブジェクトに変換されて出力されます。
> $Obj = Import-CliXML -Path .\sample.xml
# $Objにsample.xmlから変換したPSObjectが保存されます。
他のPCでエクスポートされたCliXMLファイルをインポートすることも可能です。
Discussion