about_Functions_Advanced_Methods
Descripción breve
Describe cómo las funciones que especifican el CmdletBinding
atributo pueden usar los métodos y propiedades que están disponibles para los cmdlets compilados.
Descripción larga
Las funciones que especifican el CmdletBinding
atributo pueden tener acceso a métodos y propiedades adicionales a través de la $PSCmdlet
variable . Estos métodos incluyen los métodos siguientes:
- Los mismos métodos de procesamiento de entrada disponibles para todas las funciones.
- Los
ShouldProcess
métodos yShouldContinue
que se usan para obtener comentarios del usuario antes de realizar una acción. - Método
ThrowTerminatingError
para generar registros de error. - Varios
Write
métodos que devuelven diferentes tipos de salida.
Todos los métodos y propiedades de la clase PSCmdlet están disponibles para funciones avanzadas. Para obtener más información, consulte System.Management.Automation.PSCmdlet.
Para obtener más información sobre el CmdletBinding
atributo, consulte about_Functions_CmdletBindingAttribute. Para la clase CmdletBindingAttribute , consulte System.Management.Automation.Cmdlet.CmdletBindingAttribute.
Métodos de procesamiento de entrada
Los métodos descritos en esta sección se conocen como métodos de procesamiento de entrada. En el caso de las funciones, estos tres métodos se representan mediante los begin
bloques , process
y end
de la función . PowerShell 7.3 agrega un clean
método de proceso de bloque.
No es necesario usar ninguno de estos bloques en las funciones. Si no usa un bloque con nombre, PowerShell coloca el código en el end
bloque de la función. Sin embargo, si usa cualquiera de estos bloques con nombre o define un dynamicparam
bloque, debe colocar todo el código en un bloque con nombre.
En el ejemplo siguiente se muestra el esquema de una función que contiene un bloque para el preprocesamiento único, un process
bloque para el procesamiento de varios registros y un end
bloque para el procesamiento posterior de un begin
solo uso.
Function Test-ScriptCmdlet
{
[CmdletBinding(SupportsShouldProcess=$True)]
param ($Parameter1)
begin{}
process{}
end{}
clean{}
}
Nota:
Estos bloques se aplican a todas las funciones, no solo a las funciones que usan el CmdletBinding
atributo .
begin
Este bloque se usa para proporcionar preprocesamiento opcional de un solo uso para la función. El tiempo de ejecución de PowerShell usa el código de este bloque una vez para cada instancia de la función de la canalización.
process
Este bloque se usa para proporcionar procesamiento de registros por registro para la función. Puede usar un process
bloque sin definir los demás bloques. El número de ejecuciones de process
bloques depende de cómo use la función y de qué entrada recibe la función.
La variable $_
automática o $PSItem
contiene el objeto actual de la canalización para su uso en el process
bloque . La $input
variable automática contiene un enumerador que solo está disponible para funciones y bloques de script.
Para obtener más información, vea about_Automatic_Variables.
- Al llamar a la función al principio o fuera de una canalización, se ejecuta el
process
bloque una vez. - Dentro de una canalización, el
process
bloque se ejecuta una vez para cada objeto de entrada que alcanza la función. - Si la entrada de canalización que llega a la función está vacía, el
process
bloque no se ejecuta.- Los
begin
bloques ,end
yclean
se siguen ejecutando.
- Los
Importante
Si se establece un parámetro de función para aceptar la entrada de canalización y no se define un process
bloque, se producirá un error en el procesamiento de registros por registro. En este caso, la función solo se ejecutará una vez, independientemente de la entrada.
Al crear una función que acepte la entrada de canalización y use CmdletBinding
, el process
bloque debe usar la variable de parámetro que definió para la entrada de canalización en lugar de $_
o $PSItem
. Por ejemplo:
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
Este bloque se usa para proporcionar el procesamiento posterior opcional de una sola vez para la función.
clean
El clean
bloque se agregó en PowerShell 7.3.
El bloque clean
es una manera cómoda para que los usuarios limpien los recursos que abarcan los bloques begin
, process
y end
. Es semánticamente similar a un bloque finally
que cubre todos los demás bloques con nombre de una función de script o un cmdlet de script. La limpieza de recursos se aplica en los escenarios siguientes:
- cuando la ejecución de la canalización finaliza normalmente sin error de terminación
- cuando se interrumpe la ejecución de la canalización debido a un error de terminación
- cuando la canalización está detenida por
Select-Object -First
- cuando la canalización está detenida por Ctrl+c o
StopProcessing()
El bloque limpio descarta cualquier salida escrita en la secuencia Correcto .
Precaución
Agregar el bloque clean
es un cambio importante. Dado que clean
se analiza como una palabra clave, impide que los usuarios llamen directamente a un comando denominado clean
como la primera instrucción de un bloque de script. Sin embargo, es probable que no sea un problema. El comando todavía se puede invocar mediante el operador de llamada (& clean
).
Métodos de confirmación
ShouldProcess
Se llama a este método para solicitar confirmación del usuario antes de que la función realice una acción que cambiaría el sistema. La función puede continuar en función del valor booleano devuelto por el método . Este método solo se puede llamar desde dentro del Process{}
bloque de la función. El CmdletBinding
atributo también debe declarar que la función admite ShouldProcess
(como se muestra en el ejemplo anterior).
Para obtener más información sobre este método, vea System.Management.Automation.Cmdlet.ShouldProcess.
Para obtener más información sobre cómo solicitar confirmación, vea Solicitar confirmación.
ShouldContinue
Se llama a este método para solicitar un segundo mensaje de confirmación. Se debe llamar cuando el ShouldProcess
método devuelve $true
. Para obtener más información sobre este método, vea System.Management.Automation.Cmdlet.ShouldContinue.
Métodos de error
Functions puede llamar a dos métodos diferentes cuando se producen errores. Cuando se produce un error de no terminación, la función debe llamar al WriteError
método , que se describe en la Write
sección de métodos. Cuando se produce un error de terminación y la función no puede continuar, debe llamar al ThrowTerminatingError
método . También puede usar la Throw
instrucción para finalizar errores y el cmdlet Write-Error para errores que no terminan.
Para obtener más información, vea System.Management.Automation.Cmdlet.ThrowTerminatingError.
Métodos de escritura
Una función puede llamar a los métodos siguientes para devolver diferentes tipos de salida.
Observe que no toda la salida va al siguiente comando de la canalización. También puede usar los distintos Write
cmdlets, como Write-Error
.
WriteCommandDetail
Para obtener información sobre el WriteCommandDetails
método, vea System.Management.Automation.Cmdlet.WriteCommandDetail.
WriteDebug
Para proporcionar información que se puede usar para solucionar problemas de una función, realice la llamada a la función al WriteDebug
método . El WriteDebug
método muestra mensajes de depuración al usuario. Para obtener más información, consulte System.Management.Automation.Cmdlet.WriteDebug.
WriteError
Functions debe llamar a este método cuando se producen errores de no terminación y la función está diseñada para continuar procesando registros. Para obtener más información, vea System.Management.Automation.Cmdlet.WriteError.
Nota:
Si se produce un error de terminación, la función debe llamar al método ThrowTerminatingError .
WriteObject
El WriteObject
método permite que la función envíe un objeto al siguiente comando de la canalización. En la mayoría de los casos, WriteObject
es el método que se va a usar cuando la función devuelve datos. Para obtener más información, vea System.Management.Automation.PSCmdlet.WriteObject.
WriteProgress
Para las funciones con acciones que tardan mucho tiempo en completarse, este método permite que la función llame al WriteProgress
método para que se muestre la información de progreso. Por ejemplo, puede mostrar el porcentaje completado.
Para obtener más información, vea System.Management.Automation.PSCmdlet.WriteProgress.
WriteVerbose
Para proporcionar información detallada sobre lo que hace la función, haga que la función llame al WriteVerbose
método para mostrar mensajes detallados al usuario. De forma predeterminada, no se muestran los mensajes detallados. Para obtener más información, vea System.Management.Automation.PSCmdlet.WriteVerbose.
WriteWarning
Para proporcionar información sobre las condiciones que pueden provocar resultados inesperados, haga que la función llame al método WriteWarning para mostrar mensajes de advertencia al usuario. De forma predeterminada, se muestran los mensajes de advertencia. Para obtener más información, vea System.Management.Automation.PSCmdlet.WriteWarning.
Nota:
También puede mostrar mensajes de advertencia configurando la $WarningPreference
variable o usando las Verbose
opciones de línea de comandos y Debug
. para obtener más información sobre la $WarningPreference
variable, vea about_Preference_Variables.
Otros métodos y propiedades
Para obtener información sobre los otros métodos y propiedades a los que se puede acceder a través de la $PSCmdlet
variable, consulte System.Management.Automation.PSCmdlet.
Por ejemplo, la propiedad ParameterSetName permite ver el conjunto de parámetros que se usa. Los conjuntos de parámetros permiten crear una función que realice diferentes tareas en función de los parámetros especificados cuando se ejecuta la función.