以编程方式创建参数块时无法生成 ParameterSetMetadata
我正在尝试以编程方式为函数创建参数块(沿着 此博文 )。
我从 CommandMetadata 对象(来自现有函数)。我可以创建 ParameterMetadata 对象并设置 ParameterType、名称以及一些属性等内容。
我遇到的问题是,当我使用 ProxyCommand类的GetParamBlock方法,我在ParameterMetadata的Attributes集合中设置的所有属性都没有生成。
这导致的问题是,当调用 GetParamBlock 时,新参数没有使用适当的 Parameter 属性进行注释。
例子:
function test
{
[CmdletBinding()]
param (
[Parameter()]
$InitialParameter)
Write-Host "I don't matter."
}
$MetaData = New-Object System.Management.Automation.CommandMetaData (get-command test)
$NewParameter = New-Object System.Management.Automation.ParameterMetadata 'NewParameter'
$NewParameter.ParameterType = [string[]]
$Attribute = New-Object System.Management.Automation.ParameterAttribute
$Attribute.Position = 1
$Attribute.Mandatory = $true
$Attribute.ValueFromPipeline = $true
$NewParameter.Attributes.Add($Attribute)
$MetaData.Parameters.Add('NewParameter', $NewParameter)
[System.Management.Automation.ProxyCommand]::GetParamBlock($MetaData)
I'm trying to programmatically create a parameter block for a function ( along the lines of this blog post ).
I'm starting with a CommandMetadata object (from an existing function). I can create the ParameterMetadata object and set things like the ParameterType, the name, as well as some attributes.
The problem I'm running into is that when I use the GetParamBlock method of the ProxyCommand class, none of my attributes that I set in the Attributes collection of the ParameterMetadata are generated.
The problem this causes is that when the GetParamBlock is called, the new parameter is not annotated with the appropriate Parameter attribute.
Example:
function test
{
[CmdletBinding()]
param (
[Parameter()]
$InitialParameter)
Write-Host "I don't matter."
}
$MetaData = New-Object System.Management.Automation.CommandMetaData (get-command test)
$NewParameter = New-Object System.Management.Automation.ParameterMetadata 'NewParameter'
$NewParameter.ParameterType = [string[]]
$Attribute = New-Object System.Management.Automation.ParameterAttribute
$Attribute.Position = 1
$Attribute.Mandatory = $true
$Attribute.ValueFromPipeline = $true
$NewParameter.Attributes.Add($Attribute)
$MetaData.Parameters.Add('NewParameter', $NewParameter)
[System.Management.Automation.ProxyCommand]::GetParamBlock($MetaData)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它不显示的原因是您的 NewParameter 需要属于至少一个参数集。在这种情况下,它应该是特殊参数集“__AllParameterSets”的成员。
您可以通过从 InitialParameter 复制 ParameterSetMetadata 实例来验证这一点。不幸的是,如果您没有任何参数可供获取,我无法立即了解如何获取此 ParameterSetMetadata。从其他参数复制它会使其出现在输出中,但它是来自 InitialParameter 的元数据,所以这不是解决方案,只是它不起作用的原因(还)。当我弄清楚时,我会更新这篇文章出去。
-奥辛
The reason it does not show up is because your NewParameter needs to belong to at least one parameter set. In this case, it should be a member of the special parameterset, "__AllParameterSets."
You can verify this by copying the ParameterSetMetadata instance from InitialParameter. Unfortuntely I can't see immediately how to get this ParameterSetMetadata if you don't have any parameters to grab it from. Copying it from the other parameter makes it appear in the output, but it's the metadata from InitialParameter, so this is not the solution, only the reason why it doesn't work (yet.) I'll update this post when I figure it out.
-Oisin
咆哮:
我什至非常非常生气,我们可以实例化 System.Management.Automation.ParameterMetadata 类型,但无法初始化它。
微软通过使用私有、内部或密封来限制类,从而破坏了类库的许多乐趣……他们经常使用它,并且没有任何可想象的理由。
这是一个非常疯狂的图书馆设计!
咆哮:
为了元编程和创建 ProxyCommands(代理函数),我需要从头开始以编程方式创建 Windows PowerShell 参数。
我什至不喜欢闯入课堂偷窃和使用禁止的东西,这可能会发生变化。即使序列化技巧也是在不同的路线上执行相同的肮脏方法。
这是我的解决方案原型。
我正在创建一个参数为文本的函数(函数源代码)。
我的第一次尝试是在函数驱动器中执行 New-Item Function:\ -value {code} ,然后对新函数执行 Get-Command 以提取元数据。但这表明该函数是一匹死马。它没有被编译。
所以我必须使用 Invoke-Expression 来“编译”该函数的源代码。
我构建参数集的做法正确吗?
rant on:
I was even very, very angry that we can instantiate a Type of System.Management.Automation.ParameterMetadata but we cannot initialisize it.
Microsoft destroys much joy of the class library by contraining the classes by use of private or internal or sealed...... they use it to often, and without any thinkable reason.
That is a very nuts library design!
rant off:
For metaprogramming and to create ProxyCommands (proxy functions) I had the need to create a Windows PowerShell Parameter programatically from scratch.
I even dont like to break into classes and steal and use vorbidden stuff, that is subject to change. Even the serialization trick is the same dirty way to do the same on a different route.
here is my prototype of a solution.
I am creating a Function with a Parameter as Text (function sourcecode).
my first atempt was to do a New-Item Function:\ -value {code} into the function drive and then do a Get-Command to the new function to extract the Metadata. But this shows up, that the function was a dead sorcecode only horse. It was not got compiled.
So I had to use Invoke-Expression to 'compile' the sourcecode of the function.
AM I DOING RIGHT TO CONSTRUCT THE PARAMETERSETS?