Мне было интересно, как правильно расположить объекты в скриптовых командлетах, когда конвейер был остановлен.
Обычно я инициализировал бы одноразовый объект в блоке begin
, работая с ним в блоке process
,и, наконец, расположите его в блоке end
:
function Example {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline = $true)]
[byte]$Value
)
begin {
$stream = New-Object System.IO.MemoryStream
}
process {
$stream.WriteByte($value)
}
end {
$stream.Dispose()
}
}
Но блок end
не выполняется, когда конвейер остановлен (с Ctrl + C например).И я не могу расположить объект в блоке process
, потому что он мне нужен для следующего шага в конвейере.
Я опубликовал один из возможных подходов в качестве ответа.Но есть ли более надежное решение?
(Примечание: речь идет только о скриптовых командлетах, а не скомпилированных.)