繁体   English   中英

Powershell“特殊”开关参数

[英]Powershell "special" switch parameter

我在下面有 powershell function

Function Test
{
    Param
    (               
        [Parameter()]
        [string]$Text = "default text"
    )

    Write-Host "Text : $($Text)"
}

我希望能够像下面这样调用这个 function:

Test -Text :应该在主机上显示默认文本

Test -Text "another text" :应该在主机上显示提供的文本

我的问题是 powershell 中不允许使用第一种语法。

关于如何实现这一目标的任何想法? 我想要一种“开关”参数,它可以采用 boolean 以外的值。

谢谢

TheIncorrigible1 的有用答案通过一个包罗万象的参数提供了单个参数的解决方法,该参数通过ValueFromRemainingArguments参数属性收集所有按位置传递的 arguments。

不过,从根本上说,您所要求的在 PowerShell 中不受支持

PowerShell 自 7.0 起支持具有可选值的参数 - [switch]参数除外

那是:

  • 您使用[switch]以外的类型声明的任何参数都需要一个值(参数)。

  • 唯一的其他选择是在ValueFromRemainingArguments -tagged 参数中不加选择地收集任何未绑定的位置arguments ,但您将无法将这些与任何特定的其他绑定参数相关联

换句话说:

  • 如果您碰巧只需要一个可选参数参数,那么ValueFromRemainingArguments可以为您工作(除了您应该手动处理错误接收多个值的情况),如 TheIncorrigible1 的答案所示。

  • 如果您有两个或更多这样的参数,则该方法变得不切实际:您必须知道传递参数的顺序(PowerShell 没有告诉您)以便将剩余的位置 arguments 与正确的参数相关联。


使用[switch]参数(以想象中的-Quiet开关为例):

  • 默认值 - 如果你只是通过-Quiet -是$true
  • $false通常通过根本不指定开关来指示(即省略-Quiet

但是,可以通过在开关名称后面加上:明确指定一个值,然后是 Boolean 值:

  • -Quiet:$true-Quiet相同

  • -Quiet:$false通常省略-Quiet相同; 但是,在极少数情况下,命令会区分省略的开关和具有显式$false值的开关; 值得注意的是, 常见的-Confirm参数允许使用-Confirm:$false - 而不是-Confirm省略- 来覆盖$ConfirmPreference首选项变量的值。

虽然:作为参数名称和它的参数之间的分隔符(与通常的空格字符相反),所有参数都支持,对于[switch]参数,它是必须的,以便明确表明后面的内容是switch 参数(默认情况下不需要参数)而不是独立的位置参数。


上面告诉我们PowerShell 已经具有对可选参数参数的一般支持的语法,因此在将来的某个时候可以支持任何数据类型,正如GitHub 问题中所建议的那样

您遇到的问题是参数绑定。 PowerShell 看到[string] $Text并期待一个值。 您可以像这样解决这个问题:

function Test {
    param(
        [switch]
        $Text,

        [Parameter(
            DontShow = $true,
            ValueFromRemainingArguments = $true
        )]
        [string]
        $value
    )

    if ($Text.IsPresent -and [string]::IsNullOrWhiteSpace($value)) {
        Write-Host 'Text : <default text here>'
    }
    elseif ($Text.IsPresent) {
        Write-Host "Text : $value"
    }
}

注意:这是一个 hacky 解决方案,当不传递参数时,您应该只使用默认值。

我喜欢@Maximilian Burszley 对 String 的回答(和他的名字):我为 Ints 调整了它:

function Optional-SwitchValue {
  [CmdletBinding()]
  param (
    [Switch]
    $Bump,

    [Int]
    $BumpAmount
  )

  Begin {
    # nifty pattern lifted from https://stackoverflow.com/questions/58838941/powershell-special-switch-parameter
    # default Bump to 1
    if ($Bump.IsPresent -and -not $BumpAmount) {
      $BumpAmount = 1
    }
  }
  
  Process {
    if($Bump) {
        #use $BumpAmount in some way
    }
  }
}

只需在文本中写入变量,如下所示:

Write-Host "Text : $Text"

或者甚至像这样会起作用:

 Write-Host "Text : " $Text

结果集将是:

Test
  Text :  default text

Test "my text"
  Text :  my text

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM