3

私は次のコードを持っています:

function f()
{
    begin{$count=0}
    process{$count+=10}
    end{$count}
}
1..10|f # OK
1..10|%{
    begin{$count=0}
    process{$count+=10}
    end{$count}
} # Error

%{} ブロックにエラーが表示されますが、最初の「f」呼び出しは成功します。

100
% : The script block cannot be invoked because it contains more than one clause. The Invoke() method can only be used on script blocks that contain a single clause.
At D:\Untitled1.ps1:13 char:7
+ 1..10|%{
+       ~~
    + CategoryInfo          : InvalidOperation: (:) [ForEach-Object], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.ForEachObjectCommand

しかし、なぜ?/ /ブロックForEach-Objectをサポートしていませんか?beginprocessend

4

3 に答える 3

1

補足として、読みやすいようにコードを構造化したい場合のちょっとしたポイントです。継続の目盛り ("`") は重要です。

Get-Content -Path $SelectedFiles | ForEach-Object `
-Begin {
 #- Do Begin stuff -----
 } `
-Process {
#- Do Process stuff
} `
-End {
#- Do End stuff
}
#- EndOf: ForEach is here -----
#- NB! Continuation tick "`" must be preceded by space & be LAST character on line!!!!!

ISE で役立つように、パラメーター (Begin、Process、End) の色は、正しく識別されたときに他のパラメーター (私のパラメーターは黒) と同じにする必要があります。ISE で上記のコードを試してみてください。目盛りの後にスペースを入れ、目盛りの前にスペースを入れないでください。「スペース」がどれほど重要であるかはわかりませんでした。幸運を!これが私のような別の初心者に役立つことを願っています。

于 2017-05-01T12:32:17.447 に答える