PowerShell は .Net Framework に基づいており、WMI や CIM などの他のさまざまなテクノロジが組み込まれているため、同じことを実現する方法が常に複数あります。タスクを達成するための最適な方法を選択する方法を学ぶこの短い投稿にぜひ参加してください。
このシリーズの以前の記事を必ずお読みください。
- PowerShell を使用して Windows を自動化する方法を学ぶ
- PowerShell でオブジェクトを使用する方法を学ぶ
- PowerShell での書式設定、フィルタリング、比較を学習する
- PowerShell でのリモート処理の使用方法を学ぶ
- PowerShell を使用してコンピューター情報を取得する
今週はシリーズの残りの部分もお楽しみに。
バッチ コマンドレットの使用
このシリーズの前半でパイプラインを紹介したときに、次のような方法を使用して、あるコマンドレットが出力するオブジェクトを取得して別のコマンドレットに入力として渡す方法を説明しました。
Get-Process -Name メモ帳 |停止処理
これにより、「notepad」という名前のプロセスが強制終了されます。しかし、PowerShell がどのようにして 1 つのコマンドでメモ帳のすべてのインスタンスを強制終了できるのか疑問に思われるかもしれません。答えは、Stop-Process コマンドレットのヘルプ内にあります。
ヘルプ プロセスの停止 – フル
構文セクションのコードの最後の行を見ると、InputObject パラメーターが Process[] 型のオブジェクトを受け入れることがわかります。このような型の後に 2 つの角かっこが続く場合は、パラメーターが 1 つの オブジェクトを受け入れることを意味します。前述のタイプ 以上 。この場合、1 つ以上のプロセス オブジェクトを受け入れます。技術的には、InputObject コマンドレットはプロセス 配列 を受け入れると言えます。この方法でバッチ操作をサポートするコマンドレットがある場合は、それを使用してください。これが第一の選択です。
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 になった場合は、コマンドが正常に実行されたことを思い出してください。
列挙
他の 2 つの方法が失敗した場合、多数のオブジェクトに対して何かを行う必要がある場合は、オブジェクト全体を列挙し、個々のオブジェクトに対して操作を行うことができます。まず、単一のプロセスを停止するために使用する方法を見つける必要があります。
取得プロセス | Get-Member -MemberType メソッド
完璧です。Kill メソッドを使用して、ForEach-Object にパイプしてそれらをすべて強制終了できるようです。
Get-Process -Name メモ帳 | ForEach-Object -Process {$_.Kill()}
ここでは、Get-Process から返されたすべてのプロセス オブジェクトを取得し、ForEach-Object コマンドレットに渡しました。 Where-Object コマンドレットと同様に、パイプライン内の各オブジェクトを $_ で表し、Kill() メソッドを呼び出すことができました。以上のことを踏まえると、コレクションの列挙は上記の方法よりもはるかに遅いため、最後の結果としてのみ使用する必要があります。
まとめ
選択肢 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 をさらに楽しむために、また来週お会いしましょう。





