我想为我的一个函数禁用 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 的透明超集的目标。
是否有我可以附加到我的函数的魔术属性,使其告诉外壳“我不支持通用参数”?或者还有其他方法可以解决这个问题吗?
完全不要使用高级函数,使用没有参数的普通函数。在函数内部$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)
| 归档时间: |
|
| 查看次数: |
3044 次 |
| 最近记录: |