2

我想从我创建的二进制模块中导出一个别名。对于脚本模块,您将使用 Export-ModuleMember. 二进制模块是否有等价物?

我的清单 (.psd1) 看起来像这样:

@{
    ModuleToProcess = 'MyModule.psm1'
    NestedModules = 'MyModule.dll'
    ModuleVersion = '1.0'
    GUID = 'bb0ae680-5c5f-414c-961a-dce366144546'
    Author = 'Me'
    CompanyName = 'ACME'
    Copyright = '© ACME'
} 

编辑基思希尔提供了一些帮助,但仍然无济于事。这是所有涉及的文件

我的模块脚本(.psm1):

export-modulemember -function Get-TestCommand -alias gtc

最后,我的 DLL 中的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using System.Threading.Tasks;

namespace MyModule
{
    [Cmdlet(VerbsCommon.Get, "TestCommand")]
    [OutputType(typeof(string))]
    public class GetTestCommand : PSCmdlet
    {
        protected override void ProcessRecord()
        {
            WriteObject("One");
            WriteObject("Two");
            WriteObject("Three");
        }
    }
}

如果我有这个并启动 PowerShell,然后import-module MyModule最后运行get-module,我得到这个:

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Script     MyModule                  {}

如果我注释掉export-modulememberpsm1 文件中的位并重复上述步骤,我会得到:

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Script     MyModule                  Get-TestCommand

那么,我在这里做错了什么?

4

2 回答 2

2

执行此操作的典型方法是将 .PSM1 作为 ModuleToProcess 并将 Set-Alias / Export-ModuleMember -Alias * 放入该 PSM1 文件中。然后将您的 DLL 引用放入 PSD1 的 NestedModules 成员中,例如:

@{
    ModuleToProcess = 'MyModule.psm1'
    NestedModules   = 'MyModule.dll'
    ModuleVersion = '1.0'
    GUID = 'bb0ae680-5c5f-414c-961a-dce366144546'
    Author = 'Me'
    CompanyName = 'ACME'
    Copyright = '© ACME'
    FormatsToProcess = 'MyModule.format.ps1xml'
    AliasesToExport = '*'
    CmdletsToExport = @(
        'Get-Foo',
        'Set-Foo',
        ...
    )
} 
于 2013-01-08T16:08:42.623 回答
1

好的,我现在可以正常工作了。事实证明,我犯了一些错误,所有这些都导致了这个问题。

  • 问题 1:我对 PowerShell 的了解几乎没有我想的那么好!
  • 问题 2:我混淆了函数和 Cmdlet。我需要指定Export-ModuleMember -Cmdlet Get-TestCommand,而不是Export-ModuleMember -Function Get-TestCommand. 这解释了为什么每次我取消注释该Export-ModuleMember行时我的 ExportedCommand 都会消失。Keith Hill 到 PSCE 文件的链接帮助我发现了这一点。

    Functionality in a DLL = -Cmdlet
    Functionality in .psm1 = -Function
    
  • 问题 3:如果您没有定义任何别名,它对导出别名没有帮助。您需要先设置别名Set-Alias,然后使用Export-Module. 这是我的一个愚蠢的错误

所以,最后,将我的 .psm1 文件更改为如下所示的文件解决了问题

Set-Alias gtc Get-TestCommand
Export-ModuleMember -Alias * -Function * -Cmdlet *

我将把答案归功于基思。正是因为他的努力,我才能做到这一点

于 2013-01-09T04:18:55.110 回答