1. ホーム
  2. powershell

PowerShellでForEach-Objectを終了させる方法

2023-10-10 02:33:40

質問

次のようなコードがあります。

$project.PropertyGroup | Foreach-Object {
    if($_.GetAttribute('Condition').Trim() -eq $propertyGroupConditionName.Trim()) {
        $a = $project.RemoveChild($_);
        Write-Host $_.GetAttribute('Condition')"has been removed.";
    }
};

質問1: ForEach-Objectを終了するにはどうしたらよいですか?私は "break" と "continue" を使ってみましたが、うまくいきません。

質問2: 私は、リストを foreach ループの中でリストを変更できることがわかりました。C#ではそのようなことはできません...。なぜPowerShellはそれができるのでしょうか?

どうすれば解決するの?

まず最初に Foreach-Object ではなく 実際のループと break を呼び出すと、その次の文にスキップするのではなく、スクリプト全体がキャンセルされます。

逆に breakcontinue は、実際の foreach ループの中で期待通りに動作します。

項目その1.を置くことで break の中に foreach ループを終了させることはできますが、パイプラインを停止させることはできません。このようなことをしたいようですね。

$todo=$project.PropertyGroup 
foreach ($thing in $todo){
    if ($thing -eq 'some_condition'){
        break
    }
}

項目その2。PowerShellでは、配列の中で配列を変更することができます。 foreach ループでその配列を変更することができますが、その変更はループを抜けるまで有効になりません。例として以下のコードを実行してみてください。

$a=1,2,3
foreach ($value in $a){
  Write-Host $value
}
Write-Host $a

PowerShellの作者がなぜこれを許可したのかについてはコメントできませんが、他のほとんどのスクリプト言語( パール , Python やシェル)でも同様の構成が可能です。