Saltar al contenido

Sobrecarga de funciones en PowerShell

Solución:

En PowerShell, las funciones no están sobrecargadas. La última definición anula la anterior en el mismo ámbito u oculta la anterior en un ámbito padre. Por lo tanto, debe crear una función única y proporcionar una forma de distinguir su modo de llamada por argumentos.

En V2 puede utilizar una función avanzada, consulte help about_Functions_Advanced_Parameters y evite la codificación manual al resolver ambigüedades de conjuntos de parámetros:

# advanced function with 3 parameter sets
function Backup-UsersData
(
    [Parameter(Position=0, ParameterSetName="user")]
    [string]$user,
    [Parameter(Position=0, ParameterSetName="array")]
    [object[]]$array,
    [Parameter(Position=0, ParameterSetName="all")]
    [switch]$all
)
{
    # use this to get the parameter set name
    $PSCmdlet.ParameterSetName
}

# test
Backup-UsersData -user 'John'
Backup-UsersData 1, 2
Backup-UsersData -all

# OUTPUT:
# user
# array
# all

Tenga en cuenta que este mecanismo a veces es extraño. Por ejemplo, en la primera prueba tenemos que especificar el nombre del parámetro -user explícitamente. De lo contrario:

Backup-UsersData : Parameter set cannot be resolved using the specified named parameters.
At C:TEMP_101015_110059try2.ps1:21 char:17
+ Backup-UsersData <<<<  'John'
    + CategoryInfo          : InvalidArgument: (:) [Backup-UsersData], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Backup-UsersData

En muchos casos, la función estándar, no avanzada, con parámetros mixtos servirá:

function Backup-UsersData
(
    [string]$user,
    [object[]]$array,
    [switch]$all
)
{
    if ($user) {'user'}
    elseif ($array) {'array'}
    elseif ($all) {'all'}
    else {'may be'}
}

Backup-UsersData -user 'John'
Backup-UsersData -array 1, 2
Backup-UsersData -all
Backup-UsersData

Pero en este caso, debe resolver (o aceptar e ignorar) las ambigüedades, por ejemplo, para decidir qué hacer si dice:

Backup-UsersData -user 'John' -array 1, 2 -all

Aquí hay una variante de la respuesta de Roman que creo que es un poco más flexible:

function Backup
{
    [CmdletBinding(DefaultParameterSetName="Users")]
    Param (
        [parameter(mandatory=$true, ParameterSetName="Users", position=0, ValueFromPipeline=$true)][string[]]$User,
        [parameter(mandatory=$true, ParameterSetName="AllUsers")][switch]$All
    )

    Begin
    {
        if ($All) { $User = @('User1', 'User2', 'User3') }
    }

    Process
    {
        foreach ($u in $User)
        {
            echo "Backup $u"
        }
    }
}

1) Construye una clase …

class c1 { 
    [int]f1( [string]$x ){ return 1 } 
    [int]f1( [int ]$x ){ return 2 }
    }

1+) Use MÉTODOS ESTÁTICOS si prefiere llamarlos sin instanciación …

class c1 { 
    static [int] f1( [string]$x ){ return 1 } 
    static [int] f1( [int]$x ){ return 2 } 
    }

2) Llame a los métodos en clase u objeto … la sobrecarga funciona bien

$o1 = [c1]::new()
o1.f1( "abc" ) ~> returns 1
o1.f1( 123 )   ~> returns 2

-O-


[c1]::f1( "abc" ) ~> returns 1
[c1]::f1( 123 )   ~> returns 2

3) Si (como yo)
desea tener “Funciones sobrecargadas” en una biblioteca …

para que sus usuarios puedan utilizarlos de forma transparente …
desde el código o desde la línea de comandos interactiva (REPL) …

lo más cerca que pude llegar a
“Funciones de sobrecarga en Powershell”
fue algo como esto:

function Alert-String() { [c1]::f1( "abc" ) }
function Alert-Strings(){ [c1]::f1( 123 ) }
function Alert-Stringn(){ [c1]::f1( 123 ) }

¿Quizás en PS-Core v8 ??? 😉

Espero eso ayude…

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *