【发布时间】:2019-07-27 19:41:26
【问题描述】:
给定一个脚本 foo.ps1:param($x,$y) return $x/$y
是否可以在调用时强制显式参数命名?
./foo.ps1 5 10 会产生错误 ./foo.ps1 -x 5 -y 10 就可以了
【问题讨论】:
标签: powershell
给定一个脚本 foo.ps1:param($x,$y) return $x/$y
是否可以在调用时强制显式参数命名?
./foo.ps1 5 10 会产生错误 ./foo.ps1 -x 5 -y 10 就可以了
【问题讨论】:
标签: powershell
此代码有效,但它使用了未记录的内容(我找不到任何关于负面位置的信息):
function Test
{
param(
[Parameter(Position=-1)]
$x
,
[Parameter(Position=-1)]
$y
)
$x/$y
}
Test -x 1 -y 2
Test -y 2 -x 1
Test 1 2
输出:
0.5
0.5
Test : Cannot bind positional parameters because no names were given.
At C:\TEMP\_110127_170853\q1.ps1:15 char:5
【讨论】:
如果您使用 PowerShell V2 高级函数位置属性指定位置,所有参数默认为非位置,除非为其他参数指定位置属性(来源:PowerShell In Action 2nd pg 296)。所以你可以这样做:
function Test-Args
{
param(
[parameter(Position=0)] $dummy,
$x,
$y
)
$x/$y
}
【讨论】:
您可以在 CmdletBinding 参数中指定它。 即使将 PositionalBinding 设置为 $false,您仍然可以将位置分配给您的参数。 PowerShell 将不再自动为您的参数分配位置,因此所有参数都被命名,除非另有说明。
function foo {
[CmdletBinding(PositionalBinding=$false)]
param (
[Parameter()]
[String]$a,
[Parameter(Position=0)]
[String]$a,
)
}
【讨论】:
我将在 foo.ps1 中使用这个。除非有人设法明确使用 -dummy1 或 -dummy2 来指定参数,否则它应该可以正常工作。
param($dummy1,$x,$y,$dummy2)
if (!$x -or !$y -or $dummy1 -or $dummy2){
"Error: specify -x and -y explicitly"
}
else {$x/$y}
【讨论】: