Powershell 嵌套模块中无法识别模块帮助器函数

Powershell 嵌套模块中无法识别模块帮助器函数,powershell,helper,powershell-module,Powershell,Helper,Powershell Module,我有一个由4.psm1文件组成的Powershell模块: DatabaseUserManagement.psm1-包含我的大多数公共cmdlet PermissionControl.psm1-包含最终的公共cmdlet ErrorHandling.psm1-包含一个专用错误处理函数 助手函数-包含大约10个小型私人助手函数 无论出于何种原因,PermissionControl.psm1(Set UserPermission)中的函数似乎无法看到任何帮助程序函数: 为清晰起见添加了评论 Pe

我有一个由4.psm1文件组成的Powershell模块:

  • DatabaseUserManagement.psm1-包含我的大多数公共cmdlet
  • PermissionControl.psm1-包含最终的公共cmdlet
  • ErrorHandling.psm1-包含一个专用错误处理函数
  • 助手函数-包含大约10个小型私人助手函数
无论出于何种原因,PermissionControl.psm1(Set UserPermission)中的函数似乎无法看到任何帮助程序函数:

为清晰起见添加了评论

PermissionControl.psm1

Function Set-UserPermission
{
    [CmdletBinding()]
    Param(
        # 3 parameters here. [string]$LogonName, [string]$Area and [string]$Permissions
    )

    $SamAccountName = (Get-SAMAccountName $LogonName) # Fails, can't find cmdlet.
    $Login = (Get-Login $SamAccountName) # Ditto
    $User = (Get-User $Login) # Ditto
    ...
)
Function Add-DatabaseUser
{
    [CmdletBinding()]
    Param(
       # 3 parameters here. [string]$LogonName, [string]$UserName = '' and [switch]$FullAccess
    )

    $SAMAccountName = (Get-SAMAccountName $LogonName) # Works
    $Server = Get-Server # Ditto
    $Database = Get-Database # Ditto
    ...
)
DatabaseUserManagement.psm1

Function Set-UserPermission
{
    [CmdletBinding()]
    Param(
        # 3 parameters here. [string]$LogonName, [string]$Area and [string]$Permissions
    )

    $SamAccountName = (Get-SAMAccountName $LogonName) # Fails, can't find cmdlet.
    $Login = (Get-Login $SamAccountName) # Ditto
    $User = (Get-User $Login) # Ditto
    ...
)
Function Add-DatabaseUser
{
    [CmdletBinding()]
    Param(
       # 3 parameters here. [string]$LogonName, [string]$UserName = '' and [switch]$FullAccess
    )

    $SAMAccountName = (Get-SAMAccountName $LogonName) # Works
    $Server = Get-Server # Ditto
    $Database = Get-Database # Ditto
    ...
)
HelperFunctions.psm1(仅限于前面代码中提到的那些)

DatabaseUserManagement.psd1

Function Set-UserPermission
{
    [CmdletBinding()]
    Param(
        # 3 parameters here. [string]$LogonName, [string]$Area and [string]$Permissions
    )

    $SamAccountName = (Get-SAMAccountName $LogonName) # Fails, can't find cmdlet.
    $Login = (Get-Login $SamAccountName) # Ditto
    $User = (Get-User $Login) # Ditto
    ...
)
Function Add-DatabaseUser
{
    [CmdletBinding()]
    Param(
       # 3 parameters here. [string]$LogonName, [string]$UserName = '' and [switch]$FullAccess
    )

    $SAMAccountName = (Get-SAMAccountName $LogonName) # Works
    $Server = Get-Server # Ditto
    $Database = Get-Database # Ditto
    ...
)
@{
ModuleToProcess='DatabaseUserManagement.psm1'
ModuleVersion='1.0.1'
GUID='bd4390dc-a8ad-4bce-8d69-f53ccf8e4163'
作者='removed'
公司名称='已删除'
版权='删除'
Description='已删除'
PowerShellVersion='2.0'
DotNetFrameworkVersion='4.0'
ProcessorArchitecture='amd64'
所需组件=@(
'Microsoft.SqlServer.Smo.dll'
)
嵌套模块=@(
'ErrorHandling.psm1'
,“PermissionControl.psm1”
,'HelperFunctions.psm1'
)
功能导出=@(
“添加数据库用户”
,“Get-DatabaseUser”
,“Get-DatabaseUserInformation”
,'Remove-DatabaseUser'
,“设置用户权限”
)
私有数据=@{
数据库名称='已删除'
;域名='removed'
;ServerInstancename=“已删除”
}
}
我得到的错误如下:

Get-SAMAccountName:术语“Get-SAMAccountName”未被识别为名称
指cmdlet、函数、脚本文件或可操作程序。检查单词的拼写
名称,或者如果包含路径,请验证路径是否正确,然后重试
再一次。
位于G:\My Documents\WindowsPowerShell\Modules\databaseusermanagement\PermissionControl.psm1:52 char:21
+$SamAccountName=(获取SamAccountName$LogonName)
+                        ~~~~~~~~~~~~~~~~~~
+CategoryInfo:ObjectNotFound:(Get-SAMAccountName:String)[],CommandNotFoundException
+FullyQualifiedErrorId:CommandNotFoundException

PermissionControl.psm1
不导入
HelperFunctions.psm1
,因此当然
PermissionControl.psm1
中的函数不能使用
HelperFunctions.psm1
中的函数。所有嵌套模块都相互独立。只有当根模块显式导出嵌套模块成员或根模块忽略Export ModuleMember命令时,才会将嵌套模块的成员导入调用方的会话状态。默认情况下,这将导出所有命令,包括来自嵌套模块的命令。因此,在DatabaseUserManagement.psd1的functionstoexport表中添加Get-SAMAccountName应该可以
导入模块(连接路径$PSScriptRoot HelperFunctions.psm1)
@Kayasax在这种情况下,您只需将helper函数公开到全局范围。和
PermissionControl.psm1
将从全局范围使用该助手函数。如果有人在全局范围内重新定义了
Get-SAMAccountName
,那么
PermissionControl.psm1
将使用重新定义的版本,而
DatabaseUserManagement.psm1
将使用从
HelperFunctions.psm1
导入的旧版本。