PowerShell Get-ContentのPowerShell Tail相当

自動化により、テキストファイルからデータを読み取ることは一般的なシナリオです。ほとんどのプログラミング言語には、テキストファイルを読み取る方法が少なくとも1つあり、PowerShellも例外ではありません。PowerShellのGet-Contentコマンドレットは、PowerShellのtailに相当し、テキストファイルの内容を読み取り、データをPowerShellセッションにインポートします。

PowerShellのGet-Contentコマンドレットは、スクリプトでテキストファイルを入力として使用する必要がある場合に欠かせないツールです。たとえば、PowerShellスクリプトが監視するコンピュータリストを読み取る必要があるか、ユーザーに送信するメールテンプレートをインポートする必要がある場合など、PowerShell Get-Contentはこれらのシナリオを簡単にサポートします!

リアルタイムでログファイルをフォローするのはどうですか?はい、PowerShell Get-Contentもそれができます!この記事を読み続けると、PowerShellでGet-Contentコマンドレットを使用してテキストファイルを読み取る方法を学ぶことができます。

前提条件

このチュートリアルの例に従うことに興味がある場合は、次の要件が必要です。

  • Windows 10が実行されているコンピュータが必要です。このチュートリアルでは、Windows 10バージョン20H2を使用します。しかし、お持ちのWindows 10バージョンでも大丈夫です。
  • コンピュータには、少なくともWindows PowerShell 5.1、またはPowerShell 7.1がインストールされている必要があります。ここではPowerShell 7.1を使用していますが、どちらのバージョンも機能します!
  • あなたはコマンドを書いてテストする必要があるので、コードエディタが必要です。推奨されるエディタは、Windowsに組み込まれているWindows PowerShell ISEと、Visual Studio Code(VSCode)です。この記事ではVSCodeを使用します。
  • また、コンピューター上に作業ディレクトリを作成すると役立ちます。作業フォルダはどこにでも作成できます。ただし、このチュートリアルの例はC:\demoフォルダにあることに注意してください。
  • まずはじめに、コンテンツが必要です!作業ディレクトリに、fruits.txtという名前のファイルを作成し、シンプルな果物を10個含めます。このテキストファイルをすべての例で使用します。
cherry
 berry
 apricot
 papaya
 raspberry
 melon
 peach
 tangerine
 cantaloupe
 orange

どのPowerShellバージョンをお持ちかわかりませんか?記事PowerShellバージョンを確認する方法(すべての方法を紹介!)をご覧ください。

テキストファイルを読み取り、結果を文字列配列として返す

Get-Contentコマンドレットは、ファイルからコンテンツを読み取り、デフォルトではテキストファイルの各行を文字列オブジェクトとして返します。その結果、PowerShellオブジェクトのコレクションが文字列オブジェクトの配列になります。

以下のコードはfruits.txtファイルの内容を読み取り、以下のスクリーンショットで見られるようにPowerShellコンソールに結果を表示します。

Get-Content .\fruits.txt
Retrieving the text file content using PowerShell Get-Content.

Get-Contentはコンテンツを配列として読み取り、保存しますが、それが確かであることをどのように知ればよいですか?まず、コンテンツをPowerShellオブジェクトに保存し、その後、タイプを確認できます。

Save the content into to a object
 $fruits = Get-Content .\fruits.txt
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

スクリーンショットを見ると、$fruits 変数は 10 個のオブジェクトを含む配列です。各オブジェクトは 1 行のテキストを表します。

Confirming that the text file content is stored as an array.

テキストファイルから特定の行を返す

前の例では、デフォルトの Get-Content の結果が配列またはオブジェクトのコレクションであることを学びました。コレクション内の各アイテムはインデックス番号に対応し、PowerShell のインデックスは通常ゼロから始まります。

以下のスクリーンショットでは、文字列配列に 10 個のアイテムがあることが示されています。配列はゼロから 9 までのインデックスで 10 個のアイテムをインデックス化しました。

Showing that the indexed items in the string array start at zero index.

コンテンツの 5 番目の行のみを表示するには、インデックス番号 4 を指定する必要があります。これは、角括弧で囲まれたインデックス番号(配列表記として知られる)です。

(Get-Content .\fruits.txt)[4]

Get-Content コマンドが括弧で囲まれていることに気付くかもしれません。この表記法は、PowerShell に対して括弧で囲まれたコマンドを他の操作よりも先に実行するよう指示します。

以下のスクリーンショットでは、返される結果が raspberry であることがわかります。これはインデックス 4 の項目であり、テキストファイルの 5 番目の行に対応しています。

Returning a specific line from Get-Content results.

最後の行のコンテンツを取得する必要がある場合はどうなるでしょうか?幸いなことに、行の合計数を知る必要はありません。代わりに、インデックスとして [-1] を使用し、Get-Content はファイルの最後の行のみを表示します。

(Get-Content .\fruits.txt)[-1]

Get-Content によって返されるトップの結果の数を制限します

TotalCountパラメーターを使用して、テキストファイルから指定された行数を取得します。 TotalCountパラメーターは、long値を受け入れます。最大値は9,223,372,036,854,775,807

たとえば、以下のコマンドはコンテンツを読み取り、結果を3つのアイテムに制限します。

Get-Content .\fruits.txt -TotalCount 3

予想通り、以下の結果はテキストファイルの先頭から上位3行のみを表示します。

Reading the top three results using the Get-Content command and the TotalCount parameter.

PowerShellのTailパラメーターを使用してファイルの末尾から結果を返す

前述の例では、PowerShell Get-Contentコマンドレットを使用してテキストファイルを読み取り、上位の結果を制限しました。 PowerShell Get-Contentを使用して逆を達成することも可能です。 PowerShell Tailパラメーターを使用してファイルの末尾から指定された行数を読み取ります。

以下のコード例では、テキストファイルを読み取り、最後の4行の内容を表示します。

Get-Content .\fruits.txt -Tail 4

PowerShell tailコマンドを実行した後、期待される結果はコンテンツの最後の4行に制限されます。次に示す画像のようになります。

Getting the results from the end of a file using the Get-Content Tail parameter.

Tailパラメーターは、Waitパラメーターと一緒によく使用されます。 Waitパラメーターを使用すると、ファイルが開かれ、1秒ごとに新しいコンテンツをチェックします。以下のデモンストレーションは、TailおよびWaitパラメーターを活用しています。 Waitを終了するには、CTRL+Cのキーコンビネーションを使用します。

Get-Content -Path .\fruits.txt -Tail 1 -Wait
Using the wait and Tail parameters with Get-Content.

結果を単一の文字列として返す

以前の例で気付いたかもしれませんが、PowerShellのGet-Content出力では文字列配列を扱っています。そして、これまで学んだように、配列の性質により、コンテンツを1つずつ操作することができます。

配列はしばしばうまく機能しますが、文字列の置換がより困難になる場合があります。Get-ContentRawパラメータは、ファイルの全コンテンツを単一の文字列オブジェクトとして読み取ります。以下のコードは最初の例で使用したものと同じですが、Rawパラメータはファイルのコンテンツを単一の文字列として保存します。

Save the content into to a object
 $fruits = Get-Content .\fruits.txt -Raw
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

以下のスクリーンショットは、RawパラメータをGet-Contentに追加することで、コンテンツを配列のオブジェクトではなく単一の文字列として処理することを示しています。

Confirming that the Raw parameter of Get-Content reads the file content as a single string object.

Rawパラメータを使用してファイルの内容を単一の文字列に取得したら、それをどのように利用できるでしょうか?おそらく、そのファイルのコンテンツ内の文字列を検索して置換する必要があります。以下の例では、Get-Contentがファイルのコンテンツを単一の文字列として読み取ります。そして、replace演算子を使用して、特定の単語を別の単語に置換します。

関連記事: 文字列の検索と置換

# テキストファイルの生のコンテンツを取得する
$fruits = Get-Content .\fruits.txt -Raw
# コンテンツを表示する
$fruits
# 'apricot'という単語を'mango'に置換する
$fruits -replace 'apricot','mango'
Reading the content of a text file as a single string and replacing a word using the replace operator.

フィルターと一致するファイルからのみコンテンツを読み取る

ファイルがいっぱいのフォルダーを持っていますが、選択されたもののコンテンツのみを読み取る必要がありますか? PowerShell を使用すると、 Get-Content でファイルを個別にフィルタリングする必要はありません。 Get-ContentFilter パラメーターは、コマンドレットが読み取るファイルを制限します。

特定のファイルのコンテンツのみを読み取ることを示すために、まず読み取るためのいくつかのファイルを作成します。以下に示すように、Add-Content を使用して作業フォルダーにファイルを作成します。

# Add-Content は、指定された値を追加し、log1.log と log2.log ファイルが存在しない場合に作成します。
Add-Content -Value "This is the content in Log1.log" -Path C:\demo\Log1.log
Add-Content -Value "This is the content in Log2.log" -Path C:\demo\Log2.log
# ファイルが作成されたことを確認します
Get-ChildItem C:\demo
Creating test .log files using Add-Content.

テストファイルを作成したら、Filter および Path パラメーターを使用してルートディレクトリ内の .log ファイルのみを読み取ります。フィルター定義で使用されるアスタリスクは、.log で終わる任意のファイルを Get-Content が読み取ることを示します。パスパラメーターの終わりのアスタリスクは、ファイルの読み取りをルートディレクトリのみに制限します。

Get-Content -Path C:\demo* -Filter *.log

以下の出力のように、.log ファイルからのコンテンツのみが表示されます。

Using the Filter parameter with PowerShell Get-Content to limit the read files.

関連記事:Get-ChildItem: ファイル、レジストリ、証明書などを1つにリストアップする

ファイルの代替データストリームを読む

これまではテキストファイルのみを扱ってきましたが、Get-Contentはファイルの代替データストリーム(ADS)からデータを読み取ることができます。ストリームを別の通常のファイル内容と一緒に格納されている別のデータ属性と考えることができます。

代替データストリームはWindows NTFSファイルシステムの機能であり、したがってこれは非Windowsオペレーティングシステムと使用した場合にはGet-Contentには適用されません。

Streamパラメータを使用してファイルを参照すると、Get-Itemは以下に示すようにStreamという名前のプロパティを返します。このデフォルトのファイルコンテンツストリームは:$DATAで表されます。

デフォルトの:$DATAストリームを示すために、Get-Itemコマンドレットを使用してファイルfruits.txtで利用可能なすべてのストリームを表示します。以下に示すように、Get-Itemは単一のストリームを表示します。

Get-Item -Path .\fruits.txt -Stream *
Listing all available streams in a file using Get-Item.

Get-ContentStreamパラメータはデフォルトの:$DATAストリームのコンテンツを明示的に読み取ります。返されるコンテンツはデフォルトのGet-Content出力と同じであり、:$DATAストリームはデフォルトで読み取られます。

Get-Content -Path .\fruits.txt -Stream ':$DATA'
Explicitly reading the :$DATA stream using Get-Content.

Get-Contentを使用して代替データストリームを取得する方法を示すために、Add-Contentを使用してファイルを変更し、新しいストリームを追加します。新しいストリームをデフォルトの:$DATAストリームと並べて表示するには、Get-Itemを使用します。以下の例に示すように。

# fruits.txtファイルにSecretという名前の新しいADSを追加する
Add-Content -Path .\fruits.txt -Stream Secret -Value 'This is a secret. No one should find this.'
Get-Item -Path .\fruits.txt -Stream *
Adding the Secret alternate data stream using Add-Content and displaying the new stream with Get-Item.

デフォルトでは:$DATAストリームのみが読み取られるため、Get-ContentStreamパラメータを使用して新しいSecretストリームの内容を取得します。以下のように、デフォルトのファイル内容の代わりにSecretストリームの内容が表示されます。

Get-Content -Path .\fruits.txt -Stream secret
Using Get-Content to read the Secret alternate data stream content.

PowerShellの次のステップ Get-Content

この記事では、Get-Contentを使用してコンテンツを読み取り、操作する多くの方法を学びました。さらに、Get-Contentは代替データストリームからコンテンツを読み取る柔軟性があることを学びました!

この記事で学んだことを活用して、Get-Contentをどのように活用できるか。バックアップファイルが古くなっていないかどうかを確認し、バックアップジョブを自動的に実行する呼び出しをトリガーするためにGet-Contentを使用できるかもしれませんか?

Source:
https://adamtheautomator.com/powershell-get-content/