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

时间:2014-07-30 09:33:45

标签: powershell psake

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

Task Invoke-Deploy {

    Import-Module "somefunctions.psm1"

    Import-Module "morefunctions.psm1"

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

Function Set-Something(在模块morefunctions.psm1中定义)尝试调用函数Get-Something(在somefunctions.psm1中定义)。当它出现时我收到错误:

  

“Get-Something”一词未被识别为cmdlet的名称,   功能,脚本文件或可操作程序。

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

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

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

2 个答案:

答案 0 :(得分:2)

我创建了一个脚本模块 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

答案 1 :(得分:0)

我今天遇到了这个并让它发挥作用。

在你的模块" morefunctions.psm1"你需要像这样导出你想要的方法:

 Export-ModuleMember -Function Set-Something

在你的psake任务中,你需要在方法前面添加模块名称,以便PowerShell可以找到它:

Import-Module "morefunctions.psm1"

morefunctions\Set-Something