gpt4 book ai didi

powershell - 我可以为 PowerShell 中的参数指定条件默认值吗?

转载 作者:行者123 更新时间:2023-12-02 22:39:55 25 4
gpt4 key购买 nike

我想如果这是可能的,它可能会使用参数集,所以我尝试了以下方法:

Function New-TestMultipleDefaultValues {
[CmdletBinding(DefaultParameterSetName="Default1")]
param (
[Parameter(Mandatory,ParameterSetName="Default1")]$SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1,
[Parameter(ParameterSetName="Default1")]$Test1 = "Value1",
[Parameter(ParameterSetName="Default2")]$Test1 = "Value2"
)
$PSBoundParameters
}

执行此创建函数会导致错误 Duplicate parameter $test1 in parameter list.所以看起来这种方式不是一种选择。

在这一点上我唯一能想到的就是做这样的事情:
Function New-TestMultipleDefaultValues {
param (
$SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1,
$Test1
)
if (-not $Test1 -and $SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1) {
$Test1 = "Value1"
} elseif (-not $Test1 -and -not $SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1) {
$Test1 = "Value2"
}

$Test1
}

哪个有效但看起来很丑:
PS C:\Users\user> New-TestMultipleDefaultValues -SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1 "thing"
Value1
PS C:\Users\user> New-TestMultipleDefaultValues
Value2
PS C:\Users\user> New-TestMultipleDefaultValues -Test1 "test"
test

有没有更好的方法来实现这一点?

最佳答案

以下应该有效:
由于不再需要显式参数集,因此我省略了它们;没有特定属性,[Parameter()]属性也不再是严格需要的。

Function New-TestMultipleDefaultValues {

[CmdletBinding()]
param (
[Parameter()] $SomeOtherThing,
[Parameter()] $Test1 =
('Value2', 'Value1')[$PSBoundParameters.ContainsKey('SomeOtherThing')]
)

# * As expected, if -Test1 <value> is explicitly specified,
# parameter variable $Test1 receives that value.
# * If -Test1 is omitted, the expression assigns 'Value1` to $Test1
# if -SomeOtherThing was specified, and 'Value2' otherwise.
$Test1 # Output the effective value of $Test1

}
  • 可以使用表达式作为参数默认值。
  • 上面的代码是一个表达式,因此可以按原样使用。
  • 要将单个命令(对 PowerShell cmdlet、函数、脚本或外部程序的调用)用作表达式,请将其括在 (...) 中, grouping operator .
  • 在所有其他情况下,您需要 $(...) , subexpression operator (或 @(...)array-subexpression operator )将代码转换为表达式;这些情况是:
  • 一个 Throw语句(假设是 exitreturn 语句,但您不会在这种情况下使用它们)
  • 复合结构,例如 foreach , while , ...
  • 多个命令、表达式或复合结构,用 ; 分隔


  • 但是,始终使用 $(...) 是安全的。 (或 @(...) )包含计算默认值的代码,为简单起见,您可以选择这样做。
  • 这些表达式是在明确指定的参数绑定(bind)后计算的,这允许表达式通过自动 $PSBoundParameters 来检查已绑定(bind)的参数。多变的:
  • ('Value2', 'Value1')[$PSBoundParameters.ContainsKey('SomeOtherThing')]只是一个更简洁的重新表述if ($PSBoundParameters.ContainsKey('SomeOtherThing')) { 'Value1' } else { 'Value2' }利用 [bool]值映射到 0 ( $false ) 和 1 ( $true ) 用作数组索引(整数)时。
  • 在 PowerShell v7+ 中,您可以改用三元条件,它具有使评估短路的额外优势:$PSBoundParameters.ContainsKey('SomeOtherThing') ? 'Value1' : 'Value2'

  • 关于powershell - 我可以为 PowerShell 中的参数指定条件默认值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268854/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com