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 ?