powershell – 在psake任务中使用时在模块中定义的函数范围

我有一个psake任务看起来像下面(这是为了清晰简化):

Task Invoke-Deploy {

    Import-Module "somefunctions.psm1"

    Import-Module "morefunctions.psm1"

    Set-Something #This is a function defined in morefunctions.psm1
}

函数集 – 某事(在模块morefunctions.psm1中定义)尝试调用函数Get-Something(在somefunctions.psm1中定义).当它发生时,我收到一个错误:

The term ‘Get-Something’ is not recognized as the name of a cmdlet,
function, script file, or operable program.

有趣的是,我将“morefunctions.psm1”修改为“Import-Module”somefunctions.psm1“’,此时一切正常.我宁愿不必这样做,因为我希望我的模块“松散耦合”,因为他们不需要依赖其他模块的存在.

我对Powershell中的函数/变量范围的了解是有限的,但我认为两个不同的导入模块中的函数存在于同一范围内,因此其中一个模块中的函数可以在另一个模块中调用函数.

我怀疑这个范围受到我在一个psake任务中的事实的影响,我希望这里的某个人可以确认这一点并且还建议我应该做些什么来解决这个问题. TIA.

最佳答案 我创建了一个脚本模块test-module.psm1:

function Invoke-Test {
    Import-Module ".\somefunctions.psm1"

    Import-Module ".\morefunctions.psm1"

    Set-Something #This is a function defined in morefunctions.psm1
}

和一些虚拟模块,somefunctions.psm1:

function Get-Something {
    'Get-Something'
}

和morefunctions.psm1:

function Set-Something {
    Get-Something
    'Set-Something'
}

如果我打电话

Import-Module .\test-module.psm1
Invoke-Test

然后我得到错误“Get-Something:’Get-Something’这个词不是
被识别为cmdlet,函数,脚本文件或可操作的名称
程序.“.所以它看起来像处理脚本的通用PowerShell问题
模块.我试过PowerShell v2.0,v3.0和v4.0.

也许这在没有变通方法的psake中无法解决,因为它是一个脚本
模块.您可以使用类似的工具
Invoke-Build.它已实施
作为脚本,避免这样的问题.它工作正常
使用此构建脚本:

Task Invoke-Deploy {

    Import-Module ".\somefunctions.psm1"

    Import-Module ".\morefunctions.psm1"

    Set-Something #This is a function defined in morefunctions.psm1
}

按预期输出:

Build Invoke-Deploy ...\.build.ps1
Task /Invoke-Deploy
Get-Something
Set-Something
Done /Invoke-Deploy 00:00:00.0150008
Build succeeded. 1 tasks, 0 errors, 0 warnings 00:00:00.1450083
点赞