2 votes

Usine d'attribution d'alias PowerShell

Je dois prendre en charge plusieurs instances de base de données, j'ai donc créé une fonction "factory" pour attribuer un alias ( Invoke-DbCmd ) à la fonction/cmdlet souhaitée :

MySql (factice) :

function Invoke-MySqlCmd {
    param(
        [string]$Query
    )
    write-debug "Invoke-MySqlCmd"

    # add implementation
}

Oracle (factice) :

function Invoke-OracleCmd {
    param(
        [string]$Query
    )
    write-host "Invoke-OracleCmd"

    # add implementation
}

Fonction "usine" :

function Register-DbCommand {

    param(
        [ValidateSet('com.oracle','com.microsoft','org.mysql')]
        [string]$Namespace
    )

    # remove existing assignment
    Remove-Item alias:\Invoke-DbCmd -ErrorAction SilentlyContinue

    $cmd = $null

    switch ($Namespace) {
        com.microsoft { 
            write-debug "Invoke-SqlCmd"
            $cmd = Get-Command Invoke-SqlCmd
        } 
        com.oracle { 
            write-debug "Invoke-OracleCmd"
            $cmd = Get-Item Function:Invoke-OracleCmd
        } 
        org.mysql {
            write-debug "Invoke-MySqlCmd"
            $cmd = Get-Item Function:Invoke-MySqlCmd
        }
    }

    # return reference to new alias
    Set-Alias -Name Invoke-DbCmd -Value $cmd -PassThru

}

Bien qu'il semble que l'alias soit créé :

PS> register-dbcommand -Namespace 'com.oracle'
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Invoke-DbCmd

L'alias n'est pas répertorié :

PS> get-alias | ? {$_.Definition -like 'Invoke*'} | select displayname

DisplayName
-----------
?? -> Invoke-NullCoalescing
curl -> Invoke-WebRequest
icm -> Invoke-Command
iex -> Invoke-Expression
ihy -> Invoke-History
ii -> Invoke-Item
irm -> Invoke-RestMethod
iwmi -> Invoke-WmiMethod
iwr -> Invoke-WebRequest
pester -> Invoke-Pester
psake -> Invoke-psake
r -> Invoke-History
wget -> Invoke-WebRequest

Les tentatives d'utilisation de l'alias génèrent une exception :

PS> invoke-dbcmd
invoke-dbcmd : The term 'invoke-dbcmd' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ invoke-dbcmd
+ ~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (invoke-dbcmd:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Qu'est-ce qui m'échappe ?

1voto

briantist Points 959

Il est intéressant de constater que cela semble fonctionner, mais vous devriez probablement utiliser New-Alias puisque vous l'enlevez d'abord. Vous pourriez ajouter -Force et de ne pas supprimer également celle qui existe déjà.

D'après vos commentaires, ce qui précède ne semble pas avoir de rapport, essayez de le définir dans la portée globale avec New-Alias -Scope Global .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X