gpt4 book ai didi

powershell - PowerShell 脚本中的 bool 参数值

转载 作者:行者123 更新时间:2023-12-05 03:36:28 27 4
gpt4 key购买 nike

我想了解 PowerShell 脚本如何处理 bool 参数值。

我有一个包含 4 个参数的脚本,其中 2 个是 bool 变量。当我运行脚本并将这些参数之一设置为 $False 时,脚本仍然认为此变量设置为 $True。

版本 1:BooleanTest.ps1(使用 BOOLEAN 参数)

param(
[Parameter(Mandatory=$True, Position=1)][string]$param1,
[Parameter(Mandatory=$True, Position=2)][string]$param2,
[Parameter(Mandatory=$True, Position=3)][bool]$param3,
[Parameter(Mandatory=$True, Position=4)][bool]$param4
)

write-output $param1, $param2, $param3, $param4

从命令提示符运行此脚本会返回以下内容:

>BooleanTest.ps1 -param1 "String1" -param2 "String2" -param3 $True -param4 $False
String1
String2
$True
$True

我还尝试调整此脚本以改为使用开关参数:

版本 2:BooleanTest.ps1(使用 SWITCH 参数)

param(
[Parameter(Mandatory=$True, Position=1)][string]$param1,
[Parameter(Mandatory=$True, Position=2)][string]$param2,
[switch]$param3,
[switch]$param4
)

write-output $param1, $param2, $param3, $param4

从命令提示符运行此版本返回:

>BooleanTest.ps1 -param1 "String1" -param2 "String2" -param3:$True -param4:$False
String1
String2

IsPresent
---------
True
False

基于这些试验,我有以下问题:

  • 在版本 1 中,为什么第四个变量在我声明为 $False 时错误地返回为 $True?
  • 在版本 2 中,为什么返回“IsPresent”列表?
  • switch 语句是如何工作的?传入变量后,是否需要运行额外的代码来分配 True/False 值,还是可以按原样使用参数?

我已经阅读了多篇帮助和疑难解答文章,但似乎没有关于将 bool 值传递给脚本的任何明确文档。如果有任何信息可以帮助我理解在这种情况下应用的正确技术,我将不胜感激。

我的系统设置:
操作系统:Windows 10
PowerShell 版本:PowerShell 7.1.5

最佳答案

版本 1

这对我有用。我得到以下输出:

String1
String2
True
False

我不确定当您运行它时发生了什么,但这是您提供的预期输出。


版本 2

您没有使用 bool类型,您正在使用 switch类型。 switch 的行为很 bool 值,但不是 bool 值。在确定真实性时,最终会考虑 IsPresent 的值,而不是真实性的默认行为。当 switch 值为 $false 或未提供时,它的计算结果为 $false。如果 switch 值为 $true 或已提供,则它的计算结果为 $true

Note: I stated IsPresent is considered when comparing switch to bool. This is an oversimplification and technically incorrect, though you can look at IsPresent to understand how the determination would be made. If you want a more advanced explanation, read on.

The actual reason and "secret sauce" behind the magic is because the SwitchParameter type ([switch] is a type accelerator for SwitchParameter) overloads the == and != comparison operators, and casting operators between bool and switch both ways. These overloads allow switch and bool to functionally behave like the same type during comparisons and allows implicit conversion (typecasting) between the two, despite being completely different ValueTypes.

大多数情况下,boolswitch 之间的差异无关紧要。在 99% 的情况下,您在比较中以相同的方式使用它们,除了当您实际需要检查其中任何一个的属性时可能用于调试的代码。

它们在默认输出方面也不同,当写入控制台时 switch 有不同的 display-formatter,它将输出格式化为显示 的表格IsPresent 默认情况下,与 bool 类型不同。然而,这是一个非常小的差异。

它们主要的区别在于您何时以及如何使用它们。


何时使用switch

switch 最适合与参数定义一起使用。它们是 PowerShell 惯用的这种方式,您不需要为参数提供 $true$false 值。您只需指定它们或不喜欢这样:

BooleanTest2.ps1 -param1 "String1" -param2 "String2" -param3

这将输出与您当前调用版本 2 bool 测试相同的输出。尽管如您所见,您可以提供 $true$false 值,当您需要有条件地提供 开关时,这会很方便 基于另一个条件。

何时使用bool

相反,使用 bool 作为参数不太常见,不被认为是惯用的。您必须以与任何其他类型相同的方式提供参数和值。在实践中,这通常不是问题,只要它被记录在案,但这是需要考虑的事情。 bool 最常用于脚本中未定义函数参数的其他任何地方。

关于powershell - PowerShell 脚本中的 bool 参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69589765/

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