这是我想要做的一个例子。
Function Get-Parameters { Echo $SomeMagicMethod.Get("Name"); }
Get-Parameters -Name "John Doe"
$SomeMagicMethod
是一个自动变量或任何其他方法来获取命名的未声明参数。
在Powershell中可以吗?
答案 0 :(得分:1)
你必须自己解析无界的论点,并在你正在寻找的任何参数名称之后找到正确的论点。
我在一个单独的函数中抽象它(你也可以传递$args
,但这更清晰):
function Get-InvocationParameter
{
param(
[Parameter(Mandatory = $true, Position = 0)]
[System.Management.Automation.InvocationInfo]
$Invocation,
[Parameter(Mandatory = $true, Position = 1)]
[string]
$ParameterName
)
$Arguments = $Invocation.UnboundArguments
$ParamIndex = $Arguments.IndexOf("-$ParameterName")
if($ParamIndex -eq -1){
return
}
return $Arguments[$ParamIndex + 1]
}
然后像这样使用它:
function Get-Parameter
{
Get-InvocationParameter -Invocation $MyInvocation -ParameterName "Name"
}
你应该能够在-Name
之后(或者没有)看到这些论点:
PS C:\> Get-Parameter -Name "John Doe"
John Doe
PS C:\> Get-Parameter -Name "John Doe","Jane Doe"
John Doe
Jane Doe
PS C:\> Get-Parameter -ID 123
PS C:\>
答案 1 :(得分:1)
如果你真的想要一个带有 no 参数的函数,$args
就是你的选择。 (为什么你想要这样的东西是一个不同的问题。)无论如何,像下面这样的代码会将$args
数组解析成参数/参数对的哈希表,你可以在函数体的其余部分使用它。 / p>
function NoParams
{
$myParams = @{}
switch ($args)
{
-Foo {
if (!$switch.MoveNext()) {throw "Missing argument for Foo"}
$myParams.Foo = $switch.Current
}
-Bar {
if (!$switch.MoveNext()) {throw "Missing argument for Bar"}
$myParams.Bar = $switch.Current
}
-Baz {
if (!$switch.MoveNext()) {throw "Missing argument for Baz"}
$myParams.Baz = $switch.Current
}
default { throw "Invalid parameter '$_'" }
}
$myParams
}
答案 2 :(得分:0)
您可以定义一个特殊参数来捕获所有未绑定的参数:
Function Get-Parameters {
Param(
[Parameter(Mandatory=$true)]
$SomeParam,
[Parameter(Mandatory=$false)]
$OtherParam = 'something',
...
[Parameter(Mandatory=$false, ValueFromRemainingArguments=$true)]
$OtherArgs
)
...
}
但是,这将为您提供一个包含其余参数的数组。我们不会成为-Name
和"John Doe"
之间的关联。
如果您的功能没有定义任何其他参数,您可以将自动变量$args
用于同一端。
如果你想要某种哈希表与未绑定"命名"您需要自己构建的参数,例如像这样:
$UnboundNamed = @{}
$UnboundUnnamed = @()
$OtherArgs | ForEach-Object {
if ($_ -like '-*') {
$script:named = $_ -replace '^-'
$UnboundNamed[$script:named] = $null
} elseif ($script:named) {
$UnboundNamed[$script:named] = $_
$script:name = $null
} else {
$UnboundUnnamed += $_
}
}