gpt4 book ai didi

PowerShell 的解析模式 : argument (command) mode vs. 表达模式

转载 作者:行者123 更新时间:2023-12-03 16:46:49 24 4
gpt4 key购买 nike

谁能解释为什么当从 powershell 函数返回 $false 时,您无法使用比较运算符来确定该函数是否已返回 $false,但是当您返回 $true 时,比较计算结果为 $true?

function boolean {
return $false
}

boolean -eq $false

function boolean {
return $true
}

boolean -eq $true

>>>False
>>>True

您可以通过将函数调用设置为变量来解决此问题,但我想知道是否有人可以解释幕后发生的事情?
function boolean {
return $false
}

$bool = boolean
$bool -eq $false

function boolean {
return $true
}

$bool = boolean
$bool -eq $true

>>>True
>>>True

最佳答案

PowerShell 有 两种基本解析模式 :

  • 参数模式 , 像传统的 shell 一样工作
  • 在参数模式下,第一个标记被解释为命令名称 (例如 cmdlet 名称、函数名称或脚本或外部可执行文件的文件名),后跟以空格分隔的参数列表 .

  • 表达方式 ,它的工作原理类似于传统的编程语言。

  • 运行 Get-help about_Parsing 提供对这些模式的介绍;总之, 它是确定应用哪种模式的第一个标记。
    另请注意,给定语句可能由在任一模式下解析的部分组成。

    boolean -eq $false在参数模式下解析 ,因为它的 第一个标记看起来像命令名称 (标识符可以是程序名称、cmdlet 名称、函数名称或别名)。
    因此, -eq$false被解释为参数(参数值)传递给函数 boolean .
    由于您的 boolean函数的定义方式不强制仅将值传递给声明的参数,参数被有效地忽略,并且语句的结果是函数输出的任何内容( $false$true )。
    Mike Shepard's answer 所示, 您可以使用 param() 使函数强制仅使用声明的参数(包括无)块饰以[CmdletBinding()]属性 (这使函数成为 advanced function ),如果您无意中将参数传递给无参数 boolean ,至少会导致错误功能。

    You can work around this by setting the function call to a variable


    $bool = boolean   # execute function and capture result in variable
    $bool -eq $false # use variable in the comparison
    这样做的原因是 -eq语句以 $ 开头- 在这种情况下是一个变量引用 - 这会导致 PowerShell 在表达式模式下进行解析,其中 -eq被识别为运算符和 $false作为其 RHS。
    但是,不需要此中间步骤:
    强制将一段代码解释为表达式,将其括在 (...) 中, grouping operator :
    (boolean) -eq $false # Calls function 'boolean' and uses result as LHS of -eq
    (...)强制使用新的解析上下文 (它本身以参数或表达式模式解析,同样取决于第一个标记)和 将结果视为表达式 .然后 允许将其用作更大表达式 的一部分,例如 -eq 的操作数运算符(operator), 或作为命令参数 .

    关于PowerShell 的解析模式 : argument (command) mode vs. 表达模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48776180/

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