[英]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.