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

sco*_*obi 3 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
}
Run Code Online (Sandbox Code Playgroud)

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

这工作得很好,直到我开始使用像“-o”这样的参数。

p4 -p 1666 user -o scobi
Run Code Online (Sandbox Code Playgroud)

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

p4 : Parameter cannot be processed because the parameter name 'o' is ambiguous. Possible matches include: -OutVariable -OutBuffer.
Run Code Online (Sandbox Code Playgroud)

我找到的唯一方法是引用我的参数:

p4 -p 1666 user '-o' scobi
p4 '-p 1666 user -o scobi'
Run Code Online (Sandbox Code Playgroud)

真恶心,这妨碍了我让这个函数成为 p4.exe 的透明超集的目标。

是否有我可以附加到我的函数的魔术属性,使其告诉外壳“我不支持通用参数”?或者还有其他方法可以解决这个问题吗?

Rom*_*min 5

完全不要使用高级函数,使用没有参数的普通函数。在函数内部$args用于引用参数。

function p4()
{
    $args
}

p4 -p 1666 user -o scobi
Run Code Online (Sandbox Code Playgroud)

输出:

-p
1666
user
-o
scobi
Run Code Online (Sandbox Code Playgroud)

更新

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

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

p4 -p 1666 user -o scobi -myparam value
Run Code Online (Sandbox Code Playgroud)

输出:

param value
-p
1666
user
-o
scobi
Run Code Online (Sandbox Code Playgroud)

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

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

p4 -p 1666 user -o scobi -param value
Run Code Online (Sandbox Code Playgroud)

结果:

ERROR: ParameterBindingException:
p4 : Cannot bind parameter because parameter 'param' is specified more than once. ...
Run Code Online (Sandbox Code Playgroud)