如何禁用PowerShell函数中的常见参数解析?

时间:2010-12-24 01:55:29

标签: powershell

我想为我的一个功能禁用PowerShell的“常用参数”。通过编写如下函数,我一直在研究p4.exe(Perforce命令行实用程序)的一组扩展:

function p4(
    [parameter(valuefromremainingarguments=1)]
    [string[]]$cmdline)
{
    # ...do some fun stuff with $cmdline...
    p4.exe $cmdline  # for illustration only - actual implementation uses .net objects
}

关键是能够像我通常在命令行上那样使用p4,除非有时神奇的一些参数将被重新处理(添加新命令或调用不同的工具或其他),它总会感觉好像我我只是使用普通的p4命令行。

这很有效,直到我开始使用像'-o'这样的参数。

p4 -p 1666 user -o scobi

在这种情况下,我从PowerShell收到错误:

p4 : Parameter cannot be processed because the parameter name 'o' is ambiguous. Possible matches include: -OutVariable -OutBuffer.

我发现它的唯一方法是引用我的参数:

p4 -p 1666 user '-o' scobi
p4 '-p 1666 user -o scobi'

Yucky,并且妨碍了我的目标,即让这个函数成为p4.exe的透明超集。

是否有一个魔法属性可以附加到我的函数,使它告诉shell“我不支持常用参数”?或者还有其他方法吗?

1 个答案:

答案 0 :(得分:4)

根本不使用高级功能,使用没有参数的普通功能。在函数内部使用$args来引用参数。

function p4()
{
    $args
}

p4 -p 1666 user -o scobi

输出:

-p
1666
user
-o
scobi

<强>更新

实际上该函数仍然可以使用自己的参数,例如:

function p4($myparam)
{
    "param $myparam"
    $args
}

p4 -p 1666 user -o scobi -myparam value

输出:

param value
-p
1666
user
-o
scobi

警告:参数名称不应与其他潜在参数冲突。例如,这不起作用:

function p4($param)
{
    "param $param"
    $args
}

p4 -p 1666 user -o scobi -param value

结果:

ERROR: ParameterBindingException:
p4 : Cannot bind parameter because parameter 'param' is specified more than once. ...