Если вы хотите использовать непубличных участников, вот способ остановить конвейер. Это имитирует то, что делает select-object
. invoke-method
(псевдоним im
) - это функция для вызова закрытых методов. select-property
(псевдоним selp
) - это функция для выбора (аналогично select-object) непубличных свойств - однако она автоматически действует как -ExpandProperty
, если найдено только одно соответствующее свойство. (Я написал select-property
и invoke-method
на работе, поэтому не могу поделиться с ними исходным кодом).
# Get the system.management.automation assembly
$script:smaa=[appdomain]::currentdomain.getassemblies()|
? location -like "*system.management.automation*"
# Get the StopUpstreamCommandsException class
$script:upcet=$smaa.gettypes()| ? name -like "*StopUpstreamCommandsException *"
function stop-pipeline {
# Create a StopUpstreamCommandsException
$upce = [activator]::CreateInstance($upcet,@($pscmdlet))
$PipelineProcessor=$pscmdlet.CommandRuntime|select-property PipelineProcessor
$commands = $PipelineProcessor|select-property commands
$commandProcessor= $commands[0]
$ci = $commandProcessor|select-property commandinfo
$upce.RequestingCommandProcessor | im set_commandinfo @($ci)
$cr = $commandProcessor|select-property commandruntime
$upce.RequestingCommandProcessor| im set_commandruntime @($cr)
$null = $PipelineProcessor|
invoke-method recordfailure @($upce, $commandProcessor.command)
if ($commands.count -gt 1) {
$doCompletes = @()
1..($commands.count-1) | % {
write-debug "Stop-pipeline: added DoComplete for $($commands[$_])"
$doCompletes += $commands[$_] | invoke-method DoComplete -returnClosure
}
foreach ($DoComplete in $doCompletes) {
$null = & $DoComplete
}
}
throw $upce
}
РЕДАКТИРОВАТЬ: за комментарий mklement0:
Вот ссылка на блог чернил Nivot со сценарием в модуле «poke», который аналогичным образом предоставляет доступ непубличным участникам.
Что касается дополнительных комментариев, у меня нет значимых на данный момент. Этот код просто имитирует то, что показывает декомпиляция select-object
. Оригинальные комментарии MS (если таковые имеются), конечно, не в декомпиляции. Честно говоря, я не знаю назначения различных типов, которые использует функция. Достижение такого уровня понимания, вероятно, потребует значительных усилий.
Мое предложение: возьмите модуль тыка Ойсина. Настройте код для использования этого модуля. А потом попробуй. Если вам нравится, как он работает, используйте его и не беспокойтесь о том, как он работает (вот что я сделал).
Примечание: я не изучал "poke" на любой глубине, но я думаю, что он не имеет ничего подобного -returnClosure
. Однако добавить это должно быть легко, как это:
if (-not $returnClosure) {
$methodInfo.Invoke($arguments)
} else {
{$methodInfo.Invoke($arguments)}.GetNewClosure()
}