Powershell 从另一个模块创建时,隐式远程处理模块中的命令不可用';s函数

Powershell 从另一个模块创建时,隐式远程处理模块中的命令不可用';s函数,powershell,module,Powershell,Module,我是高级PowerShell技术的初学者。我正在尝试编写自己的PS模块。希望我能正确地表达我的问题 背景: 我已经创建了一个包含所有常用函数的模块,称为MyTools。PSM1文件只是点源于同一模块文件夹中的其他PS1文件。在模块末尾,我使用export ModuleMember-Function*-Alias*-Cmdlet*导出模块成员。(我还创建了一个清单,但我不确定这对我的问题是否重要。) 其中一个函数(称为Connect-O365)在一个点源PS1文件中定义。该功能自动连接到Offic

我是高级PowerShell技术的初学者。我正在尝试编写自己的PS模块。希望我能正确地表达我的问题

背景: 我已经创建了一个包含所有常用函数的模块,称为MyTools。PSM1文件只是点源于同一模块文件夹中的其他PS1文件。在模块末尾,我使用
export ModuleMember-Function*-Alias*-Cmdlet*
导出模块成员。(我还创建了一个清单,但我不确定这对我的问题是否重要。)

其中一个函数(称为
Connect-O365
)在一个点源PS1文件中定义。该功能自动连接到Office 365远程powershell。该功能的关键部分只需执行以下操作:

$O365PS = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $O365URL -Credential $Credential -Authentication Basic -AllowRedirection -Name "O365-$($Credential.UserName)" #-WarningAction SilentlyContinue

Import-PSSession -Session $O365PS -Prefix $CommandPrefix -WarningAction SilentlyContinue -DisableNameChecking

Connect-MsolService -Credential $Credential
“连接MSOLService”来自另一个模块MSOnline

问题:当我打开PowerShell时,通过
导入模块MyTools
加载模块,然后运行
Connect-O365
,创建会话。我看到隐式远程处理模块已经创建,并且正在从会话接收命令(至少进度条是这样告诉我的)

但是,远程会话中的Office 365命令在完成后都不可用。但是,从本地
Connect MSOLservice
加载的命令可用

如果我点源于定义
Connect-O365
函数的单个PS1文件,则该函数工作正常。我只是在从自定义模块加载函数定义时遇到了一个问题。换句话说,如果在模块加载函数时调用该函数,则导出的命令不可用。但是,如果我通过调用PS1文件来加载函数,它就可以正常工作

这是范围问题还是在最初加载MyTools模块时模块没有导出导入的命令(
Export ModuleMember

编辑:

我正在使用PowerShell 4.0

显示已加载但在函数完成后不可用的命令的附加屏幕截图

根据2012年的这个问题(我的问题与之非常相似):

建议使用另一个
导入模块(Connect-O365)-全局
包装该函数

我在PS提示符下(加载MyTools模块后)以及在函数本身中使用以下方法尝试了这一点:

导入模块(导入PSSession-会话$O365PS-前缀$CommandPrefix-警告操作SilentlyContinue-DisableNameChecking-AllowClobber)-全局

但两者都不起作用

更新[7/23]-下面添加了问题的简单说明

此函数存储在*.PSM1模块文件(例如TestModule.PSM1)中。然后通过“导入模块TestModule”加载模块

加载模块并调用函数后,“远程”前缀命令均不起作用


您可以尝试执行函数吗

. Connect-O365
这将在当前范围内执行函数(就像脚本在您自己的范围内运行一样)


导入模块的作用域是有限的,因此这有一定意义。:-)

引用BHall上面链接的另一条线索的答案,因为它对我有效:

“在TechNet的帮助下,我能够修改脚本模块,使其按照我预期的方式工作

function Connect-O365 {
    $o365cred = Get-Credential username@domain.onmicrosoft.com
    $session365 = New-PSSession `
                    -ConfigurationName Microsoft.Exchange `
                    -ConnectionUri "https://ps.outlook.com/powershell/" `
                    -Credential $o365cred `
                    -Authentication Basic `
                    -AllowRedirection 
    Import-Module (Import-PSSession $session365 -AllowClobber) -Global
}

谢谢你的建议,迈克。然而,这似乎也不起作用。我添加了另一个由远程会话加载的命令的屏幕截图,但是一旦函数完成,它们就不可用了。值得一试。在函数中导入模块时,我必须这样做。这是相关的,但无法使其工作,但。。。仍然在破解:我遇到了同样的问题,我能够用你的链接解决它。谢谢:)。
function Connect-O365 {
    $o365cred = Get-Credential username@domain.onmicrosoft.com
    $session365 = New-PSSession `
                    -ConfigurationName Microsoft.Exchange `
                    -ConnectionUri "https://ps.outlook.com/powershell/" `
                    -Credential $o365cred `
                    -Authentication Basic `
                    -AllowRedirection 
    Import-Module (Import-PSSession $session365 -AllowClobber) -Global
}