1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShellの条件付きパイプライン終了方法

2022-02-04 21:37:20

パイプラインがある条件で実行されたときに、パイプラインを終了させたいことがあります。今日は、PowerShell 2.0以降で動作する、比較的新しい方法を紹介します。まず、コードを見てください。

filter Stop-Pipeline
{
param
(
[scriptblock]
$condition = {$true}
)
 
if (& $condition)
{
continue
}
$_
}
 
do {
Get-ChildItem c:\Windows -Recurse -ErrorAction SilentlyContinue |
Stop-Pipeline { ($_.FullName.ToCharArray() -eq '\').Count -gt 3 }
} while ($false)



パイプラインはwindowsディレクトリを再帰的にスキャンし、新しく導入されたコマンドstop-pipelineはbooleanのconditionを引数に取り、conditionが成立するとパイプラインを終了させることができるようになりました。

この例では再帰の深さを制御しています。パイプラインはパスの中に3つのバックスラッシュを検出すると終了しますが、もちろん、スキャンするフォルダの深さを増やすために3からより大きな数値に整数を調整することができます。

このトリックは、Stop-Pipelineが条件を満たすとcontinue文でパイプラインを終了させるため、パイプラインをdoループに埋め込む必要があります。

少し不便に聞こえますが、魅力的に動作します。もう一つの使い方として、パイプラインを最大10秒間実行させるために

$start = Get-Date
$MaxSeconds = 10
 
do {
Get-ChildItem c:\Windows -Recurse -ErrorAction SilentlyContinue |
Stop-Pipeline { ((Get-Date) - $start).TotalSeconds -gt $MaxSeconds }
} while ($false)