about_Functions_Advanced_Methods
Краткое описание
Описывает, как функции, указывающие CmdletBinding
атрибут, могут использовать методы и свойства, доступные для скомпилированных командлетов.
Подробное описание
Функции, указывающие атрибут , CmdletBinding
могут обращаться к дополнительным методам и свойствам через переменную $PSCmdlet
. Эти методы включают следующие методы:
- Те же методы обработки входных данных, доступные для всех функций.
- Методы
ShouldProcess
иShouldContinue
, используемые для получения отзывов пользователей перед выполнением действия. - Метод
ThrowTerminatingError
для создания записей об ошибках. - Несколько
Write
методов, возвращающих различные типы выходных данных.
Все методы и свойства класса PSCmdlet доступны для расширенных функций. Дополнительные сведения см. в разделе System.Management.Automation.PSCmdlet.
Дополнительные сведения об атрибуте см. в CmdletBinding
разделе about_Functions_CmdletBindingAttribute. Класс CmdletBindingAttribute см. в разделе System.Management.Automation.Cmdlet.CmdletBindingAttribute.
Методы обработки входных данных
Методы, описанные в этом разделе, называются методами обработки входных данных. Для функций эти три метода представлены блоками begin
, process
и end
функции . PowerShell 7.3 добавляет метод блочного clean
процесса.
Вам не требуется использовать какие-либо из этих блоков в функциях. Если вы не используете именованный блок, PowerShell помещает код в end
блок функции. Однако если вы используете любой из этих именованных блоков или определяете dynamicparam
блок, необходимо поместить весь код в именованный блок.
В следующем примере показана структура функции, которая содержит begin
блок для однократной предварительной обработки, process
блок для обработки нескольких записей и end
блок для одноразовой последующей обработки.
Function Test-ScriptCmdlet
{
[CmdletBinding(SupportsShouldProcess=$True)]
Param ($Parameter1)
begin{}
process{}
end{}
}
Примечание
Эти блоки применяются ко всем функциям, а не только к функциям, используюющим CmdletBinding
атрибут .
begin
Этот блок используется для предоставления необязательной однократной предварительной обработки для функции. Среда выполнения PowerShell использует код в этом блоке один раз для каждого экземпляра функции в конвейере.
process
Этот блок используется для предоставления функции обработки записи за записью. Можно использовать блок без process
определения других блоков. Количество выполнений process
блоков зависит от того, как вы используете функцию и какие входные данные она получает.
Автоматическая переменная $_
или $PSItem
содержит текущий объект в конвейере для использования в блоке process
. Автоматическая переменная $input
содержит перечислитель, доступный только для функций и блоков скриптов.
Дополнительные сведения см. в статье about_Automatic_Variables.
- При вызове функции в начале или за пределами конвейера блок выполняется
process
один раз. - В конвейере
process
блок выполняется один раз для каждого входного объекта, который достигает функции. - Если входные данные конвейера, которые достигают функции, пусты,
process
блок не выполняется.- Блоки
begin
,end
иclean
по-прежнему выполняются.
- Блоки
Важно!
Если параметр функции настроен на прием входных данных конвейера process
, а блок не определен, обработка записей по записям завершится ошибкой. В этом случае функция будет выполняться только один раз, независимо от входных данных.
При создании функции, которая принимает входные данные конвейера и использует CmdletBinding
, process
блок должен использовать переменную параметра, определенную для входных данных конвейера $_
, вместо или $PSItem
. Пример:
function Get-SumOfNumbers {
[CmdletBinding()]
param (
[Parameter(Mandatory, Position=0, ValueFromPipeline)]
[int[]]$Numbers
)
begin { $retValue = 0 }
process {
foreach ($n in $Numbers) {
$retValue += $n
}
}
end { $retValue }
}
PS> Get-SumOfNumbers 1,2,3,4
10
PS> 1,2,3,4 | Get-SumOfNumbers
10
end
Этот блок используется для предоставления необязательной одноразовой постобработки для функции.
clean
Блок clean
был добавлен в PowerShell 7.3.
Блок clean
— удобный способ очистки ресурсов, распределенных между блоками begin
, process
и end
. Семантически он похож на блок finally
, охватывающий все другие именованные блоки функции скрипта или командлета скрипта. Очистка ресурсов применяется в следующих сценариях:
- Когда выполнение конвейера завершается нормально без неустранимой ошибки.
- Когда выполнение конвейера прерывается из-за неустранимой ошибки.
- Если конвейер остановлен с помощью
Select-Object -First
. - Если конвейер остановлен с помощью клавиш CTRL+C или команды
StopProcessing()
.
Внимание!
Добавление блока clean
является критическим изменением. Поскольку clean
анализируется как ключевое слово, пользователи не могут напрямую вызвать команду clean
в качестве первой инструкции в блоке скрипта. Однако это вряд ли будет проблемой. Команду по-прежнему можно вызвать с помощью оператора вызова (& clean
).
Методы подтверждения
ShouldProcess
Этот метод вызывается для запроса подтверждения у пользователя до того, как функция выполнит действие, которое изменит систему. Функция может продолжаться на основе логического значения, возвращаемого методом . Этот метод может вызываться только из Process{}
блока функции. Атрибут CmdletBinding
также должен объявлять, что функция поддерживает ShouldProcess
(как показано в предыдущем примере).
Дополнительные сведения об этом методе см. в разделе System.Management.Automation.Cmdlet.ShouldProcess.
Дополнительные сведения о том, как запросить подтверждение, см. в разделе Запрос подтверждения.
ShouldContinue
Этот метод вызывается для запроса второго сообщения подтверждения. Он должен вызываться, ShouldProcess
когда метод возвращает $true
. Дополнительные сведения об этом методе см. в разделе System.Management.Automation.Cmdlet.ShouldContinue.
Методы ошибок
Функции могут вызывать два разных метода при возникновении ошибок. При возникновении неустранимой ошибки функция должна вызвать WriteError
метод , который описан в Write
разделе methods. Если возникает неустранимая ошибка и функция не может продолжить работу, она должна вызвать ThrowTerminatingError
метод . Можно также использовать инструкцию Throw
для устранения ошибок и командлет Write-Error для неустранимых ошибок.
Дополнительные сведения см. в разделе System.Management.Automation.Cmdlet.ThrowTerminatingError.
Методы записи
Функция может вызывать следующие методы для возврата различных типов выходных данных.
Обратите внимание, что не все выходные данные переходят к следующей команде в конвейере. Можно также использовать различные Write
командлеты, например Write-Error
.
WriteCommandDetail
Дополнительные сведения о методе см. в WriteCommandDetails
разделе System.Management.Automation.Cmdlet.WriteCommandDetail.
WriteDebug
Чтобы предоставить сведения, которые можно использовать для устранения неполадок функции, вызовите WriteDebug
метод . Метод WriteDebug
отображает сообщения отладки для пользователя. Дополнительные сведения см. в разделе System.Management.Automation.Cmdlet.WriteDebug.
WriteError
Функции должны вызывать этот метод при возникновении неустранимых ошибок, а функция предназначена для продолжения обработки записей. Дополнительные сведения см. в разделе System.Management.Automation.Cmdlet.WriteError.
Примечание
При возникновении неустранимой ошибки функция должна вызвать метод ThrowTerminatingError .
WriteObject
Метод WriteObject
позволяет функции отправлять объект в следующую команду в конвейере. В большинстве случаев является методом, WriteObject
используемым, когда функция возвращает данные. Дополнительные сведения см. в разделе System.Management.Automation.PSCmdlet.WriteObject.
WriteProgress
Для функций с действиями, которые выполняются долго, этот метод позволяет функции вызывать WriteProgress
метод , чтобы отображались сведения о ходе выполнения. Например, можно отобразить процент завершения.
Дополнительные сведения см. в разделе System.Management.Automation.PSCmdlet.WriteProgress.
WriteVerbose
Чтобы предоставить подробные сведения о том, что делает функция, вызовите WriteVerbose
метод для отображения подробных сообщений пользователю. По умолчанию подробные сообщения не отображаются. Дополнительные сведения см. в разделе System.Management.Automation.PSCmdlet.WriteVerbose.
WriteWarning
Чтобы предоставить сведения об условиях, которые могут привести к непредвиденным результатам, вызовите функцию метода WriteWarning для отображения предупреждающих сообщений пользователю. По умолчанию отображаются предупреждающие сообщения. Дополнительные сведения см. в разделе System.Management.Automation.PSCmdlet.WriteWarning.
Примечание
Вы также можете отображать предупреждающие сообщения, настроив $WarningPreference
переменную или используя параметры командной Verbose
строки и Debug
. Дополнительные сведения о переменной см. в $WarningPreference
разделе about_Preference_Variables.
Другие методы и свойства
Сведения о других методах и свойствах, доступ к которым можно получить через переменную, см. в $PSCmdlet
разделе System.Management.Automation.PSCmdlet.
Например, свойство ParameterSetName позволяет просмотреть используемый набор параметров. Наборы параметров позволяют создать функцию, которая выполняет различные задачи на основе параметров, указанных при запуске функции.