给出以下模块:
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不是。
关于如何让它发挥作用的任何想法?
答案 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;然后它会动态选择用于执行命令的子模块。
如果您不想在每次通话时都指定数据库,可以创建自己的首选项变量。