PowerShellのスクリプト実行速度を改善する10の方法

PowerShellは、システム管理や自動化を行うための非常に強力なツールですが、複雑なスクリプトになると実行速度が遅くなることがあります。

本記事では、スクリプトのパフォーマンスを向上させるための10の具体的な方法を紹介します。

効率的なコーディングを身に付けることで、作業の自動化がよりスムーズになり、管理の手間を大幅に減らすことが可能になります。


①必要なモジュールの読み込みを最小限にする

PowerShellスクリプトの冒頭で不要なモジュールを読み込むと、実行時間が大幅に増加します。

対策: Import-Moduleコマンドは必要なときだけ使うようにし、使い終わった後はRemove-Moduleでメモリから解放します。

改善例

# 不要なモジュールの読み込みを避ける
Import-Module ActiveDirectory

# Active Directoryへの接続が終わったら解放
Remove-Module ActiveDirectory

②Where-Object の利用を減らし、フィルタリングはコマンドで行う

Where-Objectは便利ですが、全データを一度取得してからフィルタリングを行うため、処理が遅くなります。

対策: 可能な場合は、コマンド実行時にフィルタリングを行うようにします。

改善例

# 非推奨:Where-Objectで後からフィルタリング
Get-Service | Where-Object { $_.Status -eq 'Running' }

# 推奨:Get-Serviceの段階でフィルタリング
Get-Service -Status Running

③パイプラインの使用を最小限にする

パイプライン (|) を使いすぎると、処理が非効率になる場合があります。

対策: 必要な操作は一度のパイプでまとめて実行するように心がけます。

改善例

# 非推奨:複数のパイプラインを使用
Get-Process | Select-Object Name, CPU | Sort-Object CPU

# 推奨:1つのパイプラインにまとめる
Get-Process | Sort-Object CPU | Select-Object -Property Name, CPU

④変数へのキャッシュを活用する

同じコマンドを何度も実行すると無駄な処理が発生します。

対策: 結果を変数に一度キャッシュし、再利用するようにします。

改善例

# 非推奨:同じコマンドを繰り返し実行
$services = Get-Service
$runningServices = $services | Where-Object { $_.Status -eq 'Running' }
$stoppedServices = $services | Where-Object { $_.Status -eq 'Stopped' }

# 推奨:一度だけコマンドを実行し、変数にキャッシュ
$services = Get-Service
$runningServices = $services | Where-Object Status -eq 'Running'
$stoppedServices = $services | Where-Object Status -eq 'Stopped'

⑤並列処理を活用する

PowerShell 7以降ではForEach-Object -Parallelが利用可能です。

複数のタスクを同時に実行でき、処理速度が向上します。

改善例

# 並列処理を使用
$servers = @('Server1', 'Server2', 'Server3')
$servers | ForEach-Object -Parallel {
    Test-Connection $_ -Count 1
}

⑥遅延評価を活用する

大きなデータセットを扱うときは、遅延評価(System.Collections.Generic.IEnumerable)を使うことでメモリ消費を抑えつつパフォーマンスを向上できます。

改善例

# 遅延評価を使用
$data = 1..100000 | Where-Object { $_ % 2 -eq 0 }
$data.GetEnumerator() | ForEach-Object { $_ }

⑦不要なオブジェクトの型変換を避ける

型変換は処理を遅くする原因になります。

必要がない場合は型変換を避けましょう。

改善例

# 非推奨:無駄な型変換
[int]"123"

# 推奨:変換が不要な場合はそのまま利用
123

⑧過度なログ出力を避ける

Write-HostやWrite-Outputを多用すると、処理が遅くなります。

必要なログだけを残すようにしましょう。


⑨プロファイルファイルの最適化

プロファイルファイルには不要な設定を記載しないようにしましょう。

これにより、PowerShellの起動速度が向上します。


⑩最新バージョンを利用する

PowerShellの最新バージョンは、パフォーマンスの改善が施されています。

可能であれば最新版を利用するようにしましょう。


まとめ

PowerShellのスクリプトのパフォーマンスは、ちょっとした工夫で大きく改善されます。

今回紹介した10の方法を実践することで、スクリプトの実行速度を向上させ、日々の管理業務をより効率的に行えるでしょう。

ぜひ、ご自身のスクリプトにこれらの最適化技術を取り入れてください。


演習問題

演習1: Where-Objectを使わないフィルタリング

以下のスクリプトをWhere-Objectを使わずに書き直してください。

Get-Service | Where-Object { $_.DisplayName -like 'Windows*' }

演習2: 並列処理を使ったサーバーの接続テスト

以下のサーバーリストに対して、Test-Connectionを並列で実行するスクリプトを作成してください。

$servers = @('Server1', 'Server2', 'Server3', 'Server4')

解答例

解答1

# Where-Objectを使わないフィルタリング
Get-Service -DisplayName 'Windows*'

解答2

# 並列処理を使った接続テスト
$servers = @('Server1', 'Server2', 'Server3', 'Server4')
$servers | ForEach-Object -Parallel {
    Test-Connection $_ -Count 1
}

おわりに

演習問題を通じて、スクリプトの最適化技術を実践する力が身についたでしょうか。

PowerShellのスクリプトは、ほんの少しの工夫で劇的に高速化することが可能です。

これらのテクニックを活用して、業務の効率化をさらに推し進めましょう。