Theo 和 JosefZ 在 cmets 中提供了有关该问题的关键指针:
您尝试将$min 和$max 参数位置 传递给Get-Random,但Get-Random 仅支持一个 位置参数,即-Maximum参数。
因此,至少必须将$min 值作为命名 参数传递,即作为-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
请注意,当您使用Get-Command -Syntax 时,参数集names 不会出现在帮助主题中,因为它们并不是真正用于public 显示,而是他们的名字通常足以说明他们的目的。
[1] 将此与包含在 [...] 中的参数规范作为一个整体进行对比 - 例如[-Minimum <Object>] - 独立地表明参数作为一个整体是可选的(不是强制性的,即传递参数不是必需的)。