powershell の ForEach-Object で、continue しようと したら、思ったように動かなかった話。

こんなコードを書いた。

gci -r |
% {
   if ($_.Name -match "^tes.*") {
      continue
   }
   $_
}

現在のディレクトリ配下を再帰的に見て、ファイル名が tes から始まるもの以外を 表示する・・・みたいな処理。 マッチした場合のみ、 continue して次の処理に行きたいのだが、この書き方だと、 break したのと同じような動きになってしまい、初回マッチしたら、それ以降の処理 はされない。

やりたいことを満たすには、以下のように書けばいいみたい。

gci -r |
% {
   if ($_.Name -match "^tes.*") {
      return
   }
   $_
}

continue の代わりに return を使う。

参考:

powershell - Why does continue behave like break in a Foreach-Object? - Stack Overflow