技術ノート 特徴 Geek School: PowerShell でのコレクションの操作

Geek School: PowerShell でのコレクションの操作

Geek School: PowerShell でのコレクションの操作

PowerShell は .Net Framework に基づいており、WMI や CIM などの他のさまざまなテクノロジが組み込まれているため、同じことを実現する方法が常に複数あります。タスクを達成するための最適な方法を選択する方法を学ぶこの短い投稿にぜひ参加してください。

Geek School: PowerShell でのコレクションの操作

このシリーズの以前の記事を必ずお読みください。

Geek School: PowerShell でのコレクションの操作

今週はシリーズの残りの部分もお楽しみに。

バッチ コマンドレットの使用

このシリーズの前半でパイプラインを紹介したときに、次のような方法を使用して、あるコマンドレットが出力するオブジェクトを取得して別のコマンドレットに入力として渡す方法を説明しました。

Get-Process -Name メモ帳 |停止処理

これにより、「notepad」という名前のプロセスが強制終了されます。しかし、PowerShell がどのようにして 1 つのコマンドでメモ帳のすべてのインスタンスを強制終了できるのか疑問に思われるかもしれません。答えは、Stop-Process コマンドレットのヘルプ内にあります。

ヘルプ プロセスの停止 – フル

構文セクションのコードの最後の行を見ると、InputObject パラメーターが Process[] 型のオブジェクトを受け入れることがわかります。このような型の後に 2 つの角かっこが続く場合は、パラメーターが 1 つの オブジェクトを受け入れることを意味します。前述のタイプ 以上 。この場合、1 つ以上のプロセス オブジェクトを受け入れます。技術的には、InputObject コマンドレットはプロセス 配列 を受け入れると言えます。この方法でバッチ操作をサポートするコマンドレットがある場合は、それを使用してください。これが第一の選択です。

Geek School: PowerShell でのコレクションの操作

WMI の使用

WMI は Microsoft 本社から提供されるテクノロジとしては最適なものではありませんが、オブジェクトのコレクションの操作方法のリストでは 2 番目に挙げられます。次のように、Win32_Process クラスから実行中のプロセスのリストを簡単に取得できます。

Get-WmiObject –クラス Win32_Process

WMI クエリは独自の種類のオブジェクトを返すため、プロセスを停止できるメソッドを探す必要があるため、それを Get-Member にパイプします。

Get-WmiObject –クラス Win32_Process |メンバーの取得

停止するのに最も近いのは terminate メソッドのようです。したがって、それが 1 つであるはずです。 WMI オブジェクトのメソッドを呼び出すには、それを Invoke-WmiMethod にパイプしてメソッドの名前を指定するだけです。

Get-WmiObject -Class Win32_Process -Filter “name=’notepad.exe’” | Invoke-WmiMethod -Name Terminate

よかった、うまくいきました。 WMI で ReturnValue が 0 になった場合は、コマンドが正常に実行されたことを思い出してください。

Geek School: PowerShell でのコレクションの操作

列挙

他の 2 つの方法が失敗した場合、多数のオブジェクトに対して何かを行う必要がある場合は、オブジェクト全体を列挙し、個々のオブジェクトに対して操作を行うことができます。まず、単一のプロセスを停止するために使用する方法を見つける必要があります。

取得プロセス | Get-Member -MemberType メソッド

完璧です。Kill メソッドを使用して、ForEach-Object にパイプしてそれらをすべて強制終了できるようです。

Get-Process -Name メモ帳 | ForEach-Object -Process {$_.Kill()}

ここでは、Get-Process から返されたすべてのプロセス オブジェクトを取得し、ForEach-Object コマンドレットに渡しました。 Where-Object コマンドレットと同様に、パイプライン内の各オブジェクトを $_ で表し、Kill() メソッドを呼び出すことができました。以上のことを踏まえると、コレクションの列挙は上記の方法よりもはるかに遅いため、最後の結果としてのみ使用する必要があります。

Geek School: PowerShell でのコレクションの操作

まとめ

選択肢 1

Get-Process -Name メモ帳 |停止処理

選択肢 2

Get-WmiObject -Class Win32_Process -Filter “name=’notepad.exe’” | Invoke-WmiMethod -Name Terminate

選択肢 3

Get-Process -Name メモ帳 | ForEach-Object -Process {$_.Kill()}

今回はここまでです。PowerShell をさらに楽しむために、また来週お会いしましょう。

「 Geek School: PowerShell でのコレクションの操作」に関するベスト動画選定!

ガベージコレクションとは
【プログラミング入門】PowerShell【Excel操作編】 ざっくりわかるプログラミング講座