2016-06-02 2 views
2

мне нужно поддерживать несколько экземпляров базы данных, поэтому я создал функцию «фабрики», чтобы присвоить псевдоним (Invoke-DbCmd) для искомой функции/командлет:PowerShell псевдоним назначение завода

MySql (манекен):

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

    # add implementation 
} 

Oracle (фиктивная):

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

    # add implementation 
} 

функция 'Фабрика':

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 

} 

Хотя представляется, что псевдоним создается:

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

Псевдоним не указан в списке:

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 

Попытки использовать псевдоним сгенерирует исключение:

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 

Что мне не хватает?

ответ

1

Любопытно, что он работает, но вы, вероятно, должны использовать New-Alias, так как сначала удаляете его. Вы можете добавить на -Force, а затем не удалить уже существующий.

Основываясь на ваших комментариях, вышесказанное кажется несвязанным, попробуйте установить его в глобальной области с помощью New-Alias -Scope Global.

+0

Отключен линией 'Удалить-товар'. Изменена последняя строка в 'New-Alias ​​-Name Invoke-DbCmd -Value $ cmd -Force -PassThru'. Такое же поведение. – craig

+0

@craig смотреть редактировать – briantist

+0

'-Scope Global' сделал трюк. Я также включил свои исходные синтаксические элементы. – craig