PowerShell

【PowerShell】オブジェクトを操作するコマンドを使う

こんにちは!SE ブログの相馬です。

 

 

 

今回は、コマンドレットでオブジェクトの操作について書きました。コマンドレットの実行で取得したオブジェクトをどうやって使えばよいのか、サンプルスクリプトを参考にしながら簡単に纏めてみました。

 

 

 

Select-Object

 

 

Select-Object コマンドレットはオブジェクトの一部を指定する事ができます。

 

オブジェクトの一部を選択する (Select-Object) | Microsoft

 

 

オブジェクトに対して、Select-Object コマンドレットを使えば、オブジェクトの中にあるデータにアクセスする事ができます。では早速ですが、Windows のサービス情報を取得して最初の 5 行目だけを選択してコンソールに表示してみます。

 

 

 

 

こんな感じで最初の Get-Service コマンドレットによってオブジェクト(ここではサービスの情報)が表示されます。そしてパイプラインを使い、次のコマンドレットでオブジェクトの中にあるものを必要な分だけ取り出して表示します。このオブジェクトというのは理解していない方はなかなか分かりにくいと思いますが、ここではサービスの情報という名の箱だと思ってください。

 

 

上の処理では Get-Service コマンドレットを実行するとサービスの一覧が表示されますよね。まずは、この一覧表が箱(オブジェクト)だと思ってください。そしてその箱の中にはサービスの名前やマシン名など、プロパティというものが入っています。ですので、サービスから必要なプロパティを指定してあげるようなイメージになります。

 

 

使い方としては、例えばこんなサンプルだと分かり易いかと思います。使いたいコマンドレットの実行結果のオブジェクトを、Get-Member に渡してあげるのです。そうすると、Get-Memger を使って Get-Service のプロパティやメソッドなどを調べる事ができます。こういう使い方で覚えてゆくと、コマンドレットで使えるプロパティやメソッドがすぐ分かりますので便利ですので是非活用すると良いでしょう。

 

 

 

 

で、これで使えるプロパティやメソッドなどが確認できました。次に「サービス名の一覧が欲しいな、あとサービスが開始しているとか停止しているとかの状態が欲しいな」とかを考えます。するとそれがプロパティなのか、メソッドなのかが分かります。ここではサービス名もステータスもプロパティになりますので、オブジェクトからプロパティを指定してあげれば良いのです。ですので以下のような書き方になります。

 

 

話は戻りますが、Select-Object はオブジェクトの一部を選択できるコマンドレットになります。オブジェクトの一部とはプロパティやメソッドなどを指します。

 

 

では次に Get-Service コマンドレットで取得されたオブジェクトに対して名前をステータスを指定して表示してみます。

 

 

 

 

話はそれますが、特定のサービスの状態だけ取得したい場合はどうしたら良いでしょうか?例えば WinRM のサービスが欲しいんだけど、サービス名が明確に分からない時は以下のように Get-Service に -Name オプションを付けて検索対象の文字列をダブルクオーテーションで囲ってあげれば良いのです。

 

 

 

 

以上、Select-Object の説明はここまでとしておきます。次は Where-Object の説明に進みます。

 

 

 

Where-Object

 

 

Where-Object コマンドレットは、コマンドレットで取得されたオブジェクトをフィルターする事ができます。

 

Where-Object コマンドレットの使用 | Microsoft TechNet

 

 

オブジェクトに対して、Where-Object コマンドレットを使えば、オブジェクトの中にあるデータをフィルターする事ができます。では早速見てみましょう。ここでは Windows のプロセスから CPU の分だけデータを表示したい場合についてです。

 

 

最初に Get-Process コマンドレットでオブジェクト(プロセス情報)を取得します。ここからパイプラインを使って、オブジェクトから欲しい情報を抜き出してみます。

 

 

 

 

また、Where-Object コマンドレットを複数使い、更にフィルターする事もできます。以下は、Get-Service コマンドレットで取得されたオブジェクトをパイプラインでつなぎ、Where-Object で app という文字列が含まれるサービスをフィルターし、パイプラインでつなぎ、サービスのステータスが停止しているものをフィルターしています。

 

 

 

 

Where-Object の説明は以上です。次は Group-Object の説明に進みます。

 

 

Group-Object

 

 

Group-Object コマンドレットは、指定したプロパティを簡単にグループ化して、カテゴリに含まれるアイテム数を算出してくれます。

指定したプロパティが何件あるか簡単に算出してくれるのでアイテム数をすぐに算出したい時に便利なコマンドレットだと思います。

 

Group-Object コマンドレットの使用 | Microsoft TechNet

 

 

ここでは、Windows のイベントログ(システム)の直近 100 件を、Source のプロパティを元にグループ化してみます。実行結果を見ますと、Name というカラムが Source のプロパティで Name 毎にカテゴリー分けされて、Count で件数が表示されています。

 

 

 

 

Group-Object の説明は以上です。次は Sort-Object の説明に進みます。

 

 

 

Sort-Object

 

 

Sort-Object コマンドレットは、コマンドレットで取得されたオブジェクトのデータを並び替える事ができます。

 

Sort-Object コマンドレットの使用 | Microsoft TechNet

 

 

ここでは、Windows のプロセスを CPU とプロセス名だけ指定して、CPU を元に降順にソートして最初の 10 件を表示しています。

 

 

 

Sort-Object の説明は以上です。次は ForEach-Object の説明に進みます。

 

 

 

ForEach-Object

 

 

ForEach-Object コマンドレットは、コマンドレットで取得されたオブジェクトのデータを繰り返し処理する事ができます。

 

Foreach-Object コマンドレットの使用 | Microsoft TechNet

 

 

ここでは、C:\temp\log フォルダのディレクトリを Get-ChildItem コマンドレットでデータを取得し、3 日前以前のファイルを削除します。

 

  1. C:\temp\log を $purge_dir に代入
  2. 3 を $retention に代入
  3. Get-ChildItem コマンドレットで $purge_dir で指定したディレクトリのファイルを再帰的に取得
  4. Where-Object コマンドレットで最後に保存された日が (Get-Date).AddDays(-$retention) 、つまり 3 日前より前のオブジェクトを取得
  5. ForEach-Object コマンドレットでファイル名を取得し、削除を繰り返す

 

 

 

 

削除前(まだ log1.txt ~ log5.txt があります。)

 

 

削除後(log1.txt ~ log5.txt が削除されました。)

 

 

 

 

以上となります。いかがでしょうか。

 

 

今回出てきたオブジェクトを操作するコマンドレットを組み合わせて使う事によって、色々な操作ができるようになると思います。例えば、ログファイルのローテーションで、古いファイルは削除したりする場合はこのような方法でできると思います。~日より前の古いファイルを自動的に削除したり移動したりする事ができるようになりますので、このような用途は使えますし便利だと思います。

 

 

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

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴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
-,