Powershell 找不到接受参数“10”的位置参数。虽然甚至不使用位置参数

Posted

技术标签:

【中文标题】Powershell 找不到接受参数“10”的位置参数。虽然甚至不使用位置参数【英文标题】:Powershell A positional parameter cannot be found that accepts argument '10'. While not even using a positional parameter 【发布时间】:2021-04-12 10:19:26 【问题描述】:

请注意,示例代码是人为设计的,仅用于说明问题。

我想在 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错误,但主要是如何解决这个问题?

【问题讨论】:

您将参数定义为[int],但将它们视为字符串("")...此外,Minimum 参数仅命名,而第一个位置参数应该是MaximumGet-Random上的两个参数的最佳名称 仔细阅读错误信息:Get-Random : A positional parameter cannot be found…在第 11 行使用get-random -Minimum $min -Maximum $max。跨度> 【参考方案1】:

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 &lt;Object&gt;] - 独立地表明参数作为一个整体是可选的(不是强制性的,即传递参数不是必需的)。

【讨论】:

以上是关于Powershell 找不到接受参数“10”的位置参数。虽然甚至不使用位置参数的主要内容,如果未能解决你的问题,请参考以下文章

调用表达式:找不到接受参数 /s 的位置参数

Swift:找不到“|”的重载接受提供的参数

win10 找不到powershell

Powershell:在此对象(WIN10 - 18363)上找不到属性“WorkingDirectory”但存在

设备参数优化更新点完稍后就找不到了

Powershell 非位置,可选参数