在PowerShell中导入模块-ascustomobject和模块参数

时间:2011-03-15 05:07:47

标签: powershell dependency-injection module

给出以下模块:

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 个答案:

答案 0 :(得分:1)

在脚本中尝试导入模块 -Force 。出于某种原因,该命令不会替换任何以前的导入

  

-Force       重新导入模块及其成员,即使模块或其成员具有只读访问模式。

编辑:对不起,错过了上面的评论。无意“窃取”答案;)

答案 1 :(得分:1)

您正在寻找的功能可能已经出现在Powershell Community Extensions

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

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

但是如果你只是为了好玩而实施:

您可能最好使用子模块来实现您尝试实现的多态行为。顶级模块将导出单个New-ADOnetConnection cmdlet,其中包含一个参数,用于选择要用于该连接的DB;然后它会动态选择用于执行命令的子模块。

如果您不想在每次通话时都指定数据库,可以创建自己的首选项变量。