使用模块清单加载PowerShell Cmdlet程序集

时间:2016-12-21 19:32:01

标签: powershell

我正试图通过PowerShell文档,并且遇到了混乱。

我使用位于here的示例代码创建了一个cmdlet程序集。

我可以通过发出命令加载模块

Import-Module -Name *NameOfAssembly*

当然,这是因为程序集位于PowerShell可以找到它的文件夹中。

如果我创建模块清单,我能够获取模块清单以加载程序集的唯一方法是在清单的RequiredModules行添加程序集。文档(位于here)表明这实际上并不加载任何模块。根据我的观察,这与实际发生的事情相矛盾。我不正确地阅读/理解这个吗?如果没有,我错过了什么?是否有更好的方法来获取cmdlet程序集(或程序集)(我认为它们称为二进制模块)部署

1 个答案:

答案 0 :(得分:1)

首先 - 与脚本模块一样,只需将NameOfModule.dll加载到NameOfModule

中列出的任何文件夹的$env:PSModulePath子文件夹中即可加载$dir = mkdir $profile\..\Modules\Greetings -Force $dllPath = Join-Path -Path $dir.FullName -ChildPath Greetings.dll Add-Type @' using System.Management.Automation; namespace SendGreeting { [Cmdlet(VerbsCommunications.Send, "Greeting")] public class SendGreetingCommand : Cmdlet { [Parameter(Mandatory=true)] public string Name { get { return name; } set { name = value; } } private string name; protected override void ProcessRecord() { WriteObject("Hello " + name + "!"); } } } '@ -OutputAssembly $dllPath Import-Module Greetings -PassThru
RequiredModules

如果您确实需要清单(例如,对于某些元数据或外部文件),您有两种选择,具体取决于PowerShell版本:

  • v2 - ModulesToProcess(适用于较新版本,但会导致警告)
  • v3 + - RootModule(在v2上失败)

您使用的密钥RequiredAssemblies用于提供命名依赖项的方法。例如。您的代码所依赖的模块。 test.f90:7.52: module procedure my_module_fortran_new_my_double 1 Error: 'my_module_fortran_new_my_double' at (1) is not a module procedure 类似的工作,因为添加包含PowerShell cmdlet的任何程序集"只是工作" - 但那种方法会隐藏"来自您定义命令的未来用户。