PowerShell

【PowerShell】テキストファイルの操作をする

2018年7月8日


Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548

Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548

こんにちは!そーまんです。

今回は、テキストファイルの操作を PowerShell でやってみました。

ここで言うテキストファイルの操作とは、例えば該当のファイルがあるか確認したり、ファイルの中身を参照したり、ファイルを検索したり等、する事を指します。

この操作ができるようになりますと、以下のようなことができるようになります。実際この操作はよく使うと思いますので覚えておくと良いでしょう。

例えば PowerShell で条件文と組み合わせをして

「ファイルやフォルダがある場合は A の処理をして、無い場合は B の処理をする」

ここではコマンドレット別、処理別にスクリプトを分けていますので、一つずつ覚えてゆきましょう。それではまず、条件文で指定のフォルダにテキストファイルがあるかどうかの条件文になります。結果はそれぞれ Write-Output で文字列を返すようにしています。


テキストファイルの中身を表示する

Test-Path を使った処理

Test-Path コマンドレットは、指定の場所にファイルやフォルダが存在するかどうかを確認します。

また、レジストリのキーワードの存在も確認することができます。返り値として、存在する場合は True、存在しない場合は False を返します。

処理の内容としては、if 分で指定の場所にファイルがあるかないかで、Write-Output でコンソールに文字列を表示します。


Get-Content を使った処理

Get-Content コマンドレットは、ファイルの中身をコンソールに表示するコマンドレットです。

Linux であれば、cat や tail のようなものです。ですので、例えば、ログファイルのようにファイルの中身が沢山ある場合、最後の何行かだけコンソールに出力する事ももちろんできます。

それでは、上で使った Test-Path と同じような処理ですが、ファイルが存在する場合、Get-Content でファイルの中身をコンソールに表示する事をやってみます。

  • サンプル① では単純にファイルの中身を全て表示します。
  • サンプル② ではファイルの中身から最後の 5 行だけ表示します。
  • サンプル③ ではファイルの中身から指定した行だけ表示します。

(スクリプト内で Tech-Path で参照しているファイル名は同じですが、実際中身は異なっています。)


サンプル①:ファイルの中身を全て表示します。


サンプル②:ファイルの中身から最後の 5 行だけ表示します。

Get-Content コマンドレットで、指定の行だけコンソールに出力する事もできます。

Get-Content のファイル指定の後に -tail と指定の行を書きます。ここでは 5 行表示したいので -tail 5 と書いてます。


サンプル③:指定の行だけコンソールに表示します。

Get-Content のファイル指定の後にカギカッコと指定の行を書きます。

行と書いていますが、実際は配列になりますので、0 から始まります。ですので、3 行目にビルゲイツが書いていますが、0, 1, 2 と数えているので [2] と指定します。

また、範囲指定も可能です。


テキストファイルの中身を検索する

Where-Object コマンドレットを使った処理

ファイルの中から特定の文字列を検索して、コンソールに出力します。

下記の画像はサンプルで作った適当なログファイルになりますが、このログの中からエラーの行だけ出力する事をやってみます。

ファイルが存在する場合は、Get-Content でファイルの中身を $file_content に入れて、それを Where-Object で Like 検索しています。

Where-Object で特定条件でデータを抽出することができます。

サンプルのログファイルの中身です。この中身から Where-Object で Like 検索します。


Select-String コマンドレットを使った処理

Select-String コマンドレットはファイルからテキストを検索します。

先ほどのログファイルを使っています。ファイルが存在する場合は、Get-Content でファイルの中身を $file_content に入れて、Select-String で。Where-Object で特定条件でデータを抽出することができます。

オプションで指定している -Pattern は検索するテキストを文字列で指定しています。詳細は @IT の記事にありますのでリンクを貼っておきます。

また、以下のように -CaseSensitive オプションを使って、大文字小文字を区別して該当するテキストをコンソールに表示する事もできます。

Linux でいうところの grep コマンドのようなものでしょうかね。


エラーハンドリングを使った処理

try-catch を使って、エラーハンドリングをします。

  1. try を始めます。
  2. ファイルの場所を $file に代入します。
  3. Test-Path コマンドレットで $file が存在するか確認します。
    • 存在する場合は $file の中身を $file_content に代入し、Select-String で "Error" を含むテキストを表示します。
      • -ErrorAction でエラーが発生した場合に処理を中止します。
    • 存在しない場合は 「ファイルはありません」と表示します。
  4. try できなければ catch でエラーを表示します。


ファイルに書き込む

以下のように、テキストファイルにテキストを書き込みます。

Out-File コマンドレットを使ってテキストファイルに書き込みます。

オプション有無で動作が異なりますので注意が必要です。

  • オプション無しだとファイルに対して上書き
  • -Append オプション有りでファイルに対して追記


以下のスクリプトでは、ファイルの場所を $file に代入して、$file が存在すれば、Write-Output で日時とテキストをファイルに追記します。


最後に

いかがでしょうか。

テキストファイルの操作は処理結果をログファイルに残すとかで使えそうですね。

では最後までお読みいただきありがとうございました!

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴3年。PVは月15万PV程度。
趣味はボクシング、筋トレ、登山です。
穏やかで人見知りな性格です。

人気記事

1

こんにちは!そーまんです。 今回は、PC に適用されている GPO を確認する方法について書きました。 本題に入る前に、一応参考までにGPOの適用タイミングについての記事をここに貼りましたので、必要に ...

2

こんにちは!そーまんです。 今回は sysprep について、全体的に PC をセットアップする観点から書いてみました。長々と書いてあります。まずは前置きからです。 まずはじめに 組織では PC のラ ...

3

こんにちは!そーまんです。 今回は、グループポリシー (GPO) を使って、特定のコンピューターに対して、ドメインユーザーに ローカル管理者権限 (以下は特権と記載) を付与する方法について書きました ...

4

こんにちは!そーまんです。 今回は、Windows サインイン後に一時ユーザープロファイルが読み込まれてしまった場合の解決方法について書きました。 Windows 10 の検証環境をいじってたらサイン ...

5

こんにちは!そーまんです。 今回は、ユーザープロファイルを削除する方法について書いてみました。 企業の場合よくあることですが、1 台の PC を共有 PC として複数人で使ったり、また余り無いかもしれ ...

6

こんにちは!SE ブログの相馬です。       今回は、繰り返し文について書いてみました。PowerShell では他のプログラミング言語同様、繰り返し処理を行うことが ...

7

コマンドを使って CPU とメモリの使用率をデータで取得してみましたので、例えば PC のトラブルシューティングで問題を再現させる際にデータを取得しておくと、原因の特定に役立つ場合があるかと思います。

8

既存の PC と同じ構成で別のメーカーの PC でマスターイメージを作る際、インストールされているアプリを同一にする為に必要になるかと思います。

9

企業で多くの GPO が適用されている環境では、PC に GPO が適用されなかったりする問題が発生する場合があるかと思います。その中でも、コンピューターの構成またはユーザーの構成のどちらかで、...

10

こんにちは!そーまんです。 今回は、Windows Server 2019 で NTP サーバーと同期する方法について書きました。 NTP サーバーの必要性や時刻同期の重要性を理解することは社内のシス ...

-PowerShell
-,


Warning: Trying to access array offset on value of type null in /home/r5652521/public_html/soma-engineering.com/wp-content/plugins/amazonjs/amazonjs.php on line 637

Warning: Trying to access array offset on value of type null in /home/r5652521/public_html/soma-engineering.com/wp-content/plugins/amazonjs/amazonjs.php on line 637

Warning: Trying to access array offset on value of type null in /home/r5652521/public_html/soma-engineering.com/wp-content/plugins/amazonjs/amazonjs.php on line 637

Warning: Trying to access array offset on value of type null in /home/r5652521/public_html/soma-engineering.com/wp-content/plugins/amazonjs/amazonjs.php on line 637