Импорт модулей - пользовательский объект и параметры модуля в PowerShell - PullRequest
1 голос
/ 15 марта 2011

С учетом следующих модулей:

adonetlib.psml

param($ModelModule)

$dbmodel=import-module $ModelModule -AsCustomObject 

function new-ADOnetconnection{
   return $dbmodel.newconnection()
}

mysqlmodel.psm1

function newconnection{
   write-host "MySQL connection"
}

sqlservermodel.psm1

function newconnection{
   write-host "SQLServer connection"
}

Я бы хотел сделать это:

$mysql= import-module adonetlib -argumentlist mysqlmodel -ascustomobject
$sqlserver= import-module adonetlib -argumentlist sqlservermodel -ascustomobject

и имейте в виду следующее (извините за синтаксис):

$mysql."new-adonetconnection"() -> returns "MySql connection"
$sqlsever."new-adonetconnection"() -> returns "SQLServer connection"

Очевидно, что модуль adonetlib загружается только один раз (даже если мы импортировали его с другими аргументами). Оба оператора возвращают «соединение MySQL».

Также

get-module -all 

показывает, что модуль mysqlmodel загружен, а sqlservermodel - нет.

Любые идеи о том, как я могу заставить это работать?

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Требуемая функция может присутствовать уже в Расширениях сообщества Powershell :

PS C:\Users\davidp> Get-command -Module pscx | ? { $_ -like "*-ado*" } | select name

Name
----
Get-ADObject
Get-AdoConnection
Get-AdoDataProvider
Invoke-AdoCommand

Но если вы реализуете просто для удовольствия:

Возможно, вам лучше использовать субмодули для реализации полиморфного поведения, которое, похоже, вы пытаетесь достичь. Модуль верхнего уровня экспортирует один командлет New-ADOnetConnection с параметром для выбора базы данных, которую вы хотите использовать для этого соединения; тогда он будет динамически выбирать, какой подмодуль использовать для выполнения команды.

Если вы не хотите указывать БД при каждом вызове, вы можете создать собственную переменную предпочтения.

1 голос
/ 16 марта 2011

Попробуйте Import-Module -Force в вашем скрипте. По какой-то причине команда не заменяет предыдущий импорт без него

-Force Повторно импортирует модуль и его элементы, даже если модуль или его элементы имеют режим доступа только для чтения.

Редактировать: Извините, пропустил комментарий выше. Нет намерения «воровать» ответ;)

...