Powershell 找不到接受参数“10”的位置参数。虽然甚至不使用位置参数
Powershell A positional parameter cannot be found that accepts argument '10'. While not even using a positional parameter
请注意,示例代码是人为设计的,仅用于说明问题。
我想在 powershell 中创建一个函数来获取一些随机数,但我 运行 遇到了一个非常奇怪的问题,即当我不使用参数的位置定义时,我仍然会收到有关它的错误.
我的代码是:
function select-random {
param(
[Parameter(Position = 0, Mandatory)]
[int]$min,
[Parameter(Position = 1, Mandatory)]
[int]$max
)
Get-Random $min $max
}
此脚本使用命令得到的错误:select-random 5 10
A positional parameter cannot be found that accepts argument '10'.
并使用命令:select-random -min 5 -max 10
A positional parameter cannot be found that accepts argument '10'.`
最奇怪的是 ISE 在选项卡菜单中检测到手动定义的参数。
是我的语法错误还是 powershell 错误,但主要是我该如何解决这个问题?
Theo and JosefZ在问题的评论中提供了关键指针:
您正试图将 $min
和 $max
参数按位置 传递给 Get-Random
,但 Get-Random
仅支持 一个 位置参数,即 -Maximum
参数。
因此,至少 $min
值必须作为 named 参数传递,即作为 -Minimum $min
让你的命令在句法上起作用。但是,为了对称性和可读性,最好也将 $max
作为命名参数传递:
# Use *named* arguments.
Get-Random -Minimum $min -Maximum $max
如何确定命令的位置参数:
about_Command_Syntax 概念性帮助主题描述了 PowerShell 所谓的 语法图 .
中使用的符号
要(仅)显示语法图,请使用 Get-Command -Syntax
(或传递 -?
/使用 Get-Help
,它会显示附加信息):
PS> & { Get-Command -Syntax $args[0] } Get-Random
Get-Random [[-Maximum] <Object>] [-SetSeed <int>] [-Minimum <Object>] [-Count <int>] [<CommonParameters>]
Get-Random [-InputObject] <Object[]> -Shuffle [-SetSeed <int>] [<CommonParameters>]
Get-Random [-InputObject] <Object[]> [-SetSeed <int>] [-Count <int>] [<CommonParameters>]
只有名字被[...]
[1]包围的参数才是位置 - 例如[-Maximum]
- 如果支持多个,它们将按照调用时必须传递的顺序列出。
请注意,每个输出行代表一个单独的 参数集 (请参阅 about_Parameter_Sets),但由于您传递的是最小值和最大值,因此只有第一个这里很有趣:
正如你所看到的,只有 -Maximum
在第一个参数集中是有位置的,-Minimum
而所有其他参数都不是。
这里是辅助函数Get-PositionalParameter
,可以更容易地确定命令的位置参数:
Function Get-PositionalParameter {
<#
.SYNOPSIS
Outputs a given command's positional parameters, if any.
#>
param(
[Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
[string] $Name
)
Set-StrictMode -Version 1; $ErrorActionPreference = 'Stop'
# Resolve the name to a cmdlet first, if necessary
$cmd = (Get-Command $Name)
if ($cmd.ResolvedCommand) { $cmd = $cmd.ResolvedCommand }
$cmd.ParameterSets | ForEach-Object {
if ($posParams = $_.Parameters.Where( { $_.Position -ge 0 })) {
[pscustomobject] @{
PositionalParams = $posParams.Name
ParameterSet = $_.Name
}
}
}
}
应用于Get-Random
:
PS> Get-PositionalParameter Get-Random
PositionalParams ParameterSet
---------------- ------------
Maximum RandomNumberParameterSet
InputObject ShuffleParameterSet
InputObject RandomListItemParameterSet
请注意,参数集 names 不会出现在帮助主题中以及当您使用 Get-Command -Syntax
时,因为它们并不是真正用于 ]public 显示,但它们的名称通常具有足够的描述性以推断其用途。
[1] 将此与参数规范 作为一个整体进行对比 被包含在 [...]
中 - 例如[-Minimum <Object>]
- 它独立地表示整个参数是 可选的 (不是强制性的,即传递参数不是 必需的 )。
请注意,示例代码是人为设计的,仅用于说明问题。
我想在 powershell 中创建一个函数来获取一些随机数,但我 运行 遇到了一个非常奇怪的问题,即当我不使用参数的位置定义时,我仍然会收到有关它的错误.
我的代码是:
function select-random {
param(
[Parameter(Position = 0, Mandatory)]
[int]$min,
[Parameter(Position = 1, Mandatory)]
[int]$max
)
Get-Random $min $max
}
此脚本使用命令得到的错误:select-random 5 10
A positional parameter cannot be found that accepts argument '10'.
并使用命令:select-random -min 5 -max 10
A positional parameter cannot be found that accepts argument '10'.`
最奇怪的是 ISE 在选项卡菜单中检测到手动定义的参数。
是我的语法错误还是 powershell 错误,但主要是我该如何解决这个问题?
Theo and JosefZ在问题的评论中提供了关键指针:
您正试图将 $min
和 $max
参数按位置 传递给 Get-Random
,但 Get-Random
仅支持 一个 位置参数,即 -Maximum
参数。
因此,至少 $min
值必须作为 named 参数传递,即作为 -Minimum $min
让你的命令在句法上起作用。但是,为了对称性和可读性,最好也将 $max
作为命名参数传递:
# Use *named* arguments.
Get-Random -Minimum $min -Maximum $max
如何确定命令的位置参数:
about_Command_Syntax 概念性帮助主题描述了 PowerShell 所谓的 语法图 .
中使用的符号要(仅)显示语法图,请使用 Get-Command -Syntax
(或传递 -?
/使用 Get-Help
,它会显示附加信息):
PS> & { Get-Command -Syntax $args[0] } Get-Random
Get-Random [[-Maximum] <Object>] [-SetSeed <int>] [-Minimum <Object>] [-Count <int>] [<CommonParameters>]
Get-Random [-InputObject] <Object[]> -Shuffle [-SetSeed <int>] [<CommonParameters>]
Get-Random [-InputObject] <Object[]> [-SetSeed <int>] [-Count <int>] [<CommonParameters>]
只有名字被[...]
[1]包围的参数才是位置 - 例如[-Maximum]
- 如果支持多个,它们将按照调用时必须传递的顺序列出。
请注意,每个输出行代表一个单独的 参数集 (请参阅 about_Parameter_Sets),但由于您传递的是最小值和最大值,因此只有第一个这里很有趣:
正如你所看到的,只有 -Maximum
在第一个参数集中是有位置的,-Minimum
而所有其他参数都不是。
这里是辅助函数Get-PositionalParameter
,可以更容易地确定命令的位置参数:
Function Get-PositionalParameter {
<#
.SYNOPSIS
Outputs a given command's positional parameters, if any.
#>
param(
[Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
[string] $Name
)
Set-StrictMode -Version 1; $ErrorActionPreference = 'Stop'
# Resolve the name to a cmdlet first, if necessary
$cmd = (Get-Command $Name)
if ($cmd.ResolvedCommand) { $cmd = $cmd.ResolvedCommand }
$cmd.ParameterSets | ForEach-Object {
if ($posParams = $_.Parameters.Where( { $_.Position -ge 0 })) {
[pscustomobject] @{
PositionalParams = $posParams.Name
ParameterSet = $_.Name
}
}
}
}
应用于Get-Random
:
PS> Get-PositionalParameter Get-Random
PositionalParams ParameterSet
---------------- ------------
Maximum RandomNumberParameterSet
InputObject ShuffleParameterSet
InputObject RandomListItemParameterSet
请注意,参数集 names 不会出现在帮助主题中以及当您使用 Get-Command -Syntax
时,因为它们并不是真正用于 ]public 显示,但它们的名称通常具有足够的描述性以推断其用途。
[1] 将此与参数规范 作为一个整体进行对比 被包含在 [...]
中 - 例如[-Minimum <Object>]
- 它独立地表示整个参数是 可选的 (不是强制性的,即传递参数不是 必需的 )。