在尝试使我的 PowerShell cmdlet(用 C# 编写,未编写脚本)的文档尽可能完整的过程中,我发现了一个有趣的发现。如果我包含正确的 MAML 帮助文件(例如 MyModule.dll-Help.xml),则显示具有一个或多个别名的 cmdlet 参数的帮助可能如下所示:
PS> Get-Help Set-MySetting -param ItemType
-ItemType <ItemTypeChoice>
The type for the item.
Required? false
Position? 4
Default value String
Accept pipeline input? true (ByPropertyName)
Accept wildcard characters? false
另一方面,如果我删除该帮助文件并重新加载我的模块,则相同参数的帮助——现在只是从代码本身中反映出来——Get-Help
可能如下所示:
PS> Get-Help Set-MySetting -param ItemType
-ItemType <ItemTypeChoice>
The type for the item.
Required? false
Position? 4
Accept pipeline input? true (ByPropertyName)
Parameter set name (All)
Aliases Type, SettingType
Dynamic? false
注意Aliases
属性在第二个实例中的存在和在第一个实例中的不存在。
当然,第一时间认为我的 MAML 一定是不正确的。考虑到通过广泛的网络搜索,我还没有找到任何远程的东西,比如 MAML XML 模式的明确来源(!),这种可能性更有可能。但是,如果我的 MAML 不正确,那么用于 PowerShell 自己的核心 cmdlet 的 MAML 也是如此,因为这是我从那里复制它的地方,考虑到它是可靠的来源 (C:\Windows\System32\WindowsPowerShell\v1.0\ en-US\Microsoft.PowerShell.Commands.Management.dll-help.xml)。
但问题的关键证据是,即使该文件中的某些 PowerShell 核心 cmdlet 具有别名,它们也不会在您调用 Get-Help 时报告别名!这是一个例子:
PS> Get-Help Add-Computer -param DomainName
-DomainName <String>
Specifies the domain to which the computers are added. This parameter is required when adding the computers to a domain.
Required? true
Position? 1
Default value
Accept pipeline input? false
Accept wildcard characters? false
下面是 MAML 定义DomainName
参数的开头——注意末尾定义Add-Computer
的别名:
<command:parameter required="true" variableLength="false"
globbing="false" pipelineInput="false" position="1" aliases="DN,Domain">
因此,Get-Help
当它必须通过反射自己完成工作时,它知道如何报告别名,但在 的aliases
属性中提供时它无法报告别名<command:parameter>
。
问题
真正的问题是什么?
- Get-Help 期望别名
aliases
在<command:parameter>
. - 给定 MAML 文件时,Get-Help 根本无法在 MAML 中查找别名。
如果 (1),并且有人可以识别指定别名的正确方法,那么对于我自己的 cmdlet,有一个简单的解决方法。如果 (2)... 是时候在 Connect 上提出问题了!