Powershell 什么';“这背后的魔力是什么?”$($i+;+;)”什么;?

Powershell 什么';“这背后的魔力是什么?”$($i+;+;)”什么;?,powershell,Powershell,下面是一段代码,它以1秒的间隔输出13… while ($true) { sleep -s 1 "$(($i++))" } 怎么可能呢?评论中有一些很好的建议,但让我再深入一点: 解释$i++: $i++使用++,将变量$i的值增加1,这可能是C#和C/C++等语言所熟悉的。正如预期的那样,还存在一个完整的基本减量运算符(--) 由于++位于变量之后(后缀形式),因此在语句中使用变量的值之后会发生递增;将其放在变量-+$i(前缀形式)之前将首先执行递增操作;如果在中单独使用递增/递

下面是一段代码,它以1秒的间隔输出
13…

while ($true) {
  sleep -s 1
  "$(($i++))"
}

怎么可能呢?

评论中有一些很好的建议,但让我再深入一点:

解释
$i++

  • $i++
    使用
    ++
    ,将变量
    $i
    的值增加
    1
    ,这可能是C#和C/C++等语言所熟悉的。正如预期的那样,还存在一个完整的基本减量运算符(
    --

    • 由于
      ++
      位于变量之后(后缀形式),因此在语句中使用变量的值之后会发生递增;将其放在变量-
      +$i
      (前缀形式)之前将首先执行递增操作;如果在中单独使用递增/递减操作,则该区别无关

    • $i
      假定包含数字类型的实例,否则会发生错误;如果变量
      $i
      尚未初始化,则其值实际上是
      $null
      ,PowerShell会强制该变量为
      [int]
      -键入的
      0
      。因此,
      $i++
      在其语句的上下文中计算为
      0
      ,然后递增为
      1

  • 递增/递减表达式(如
    $i++
    )被视为赋值处理
    ——您可以将其视为
    $i=$i+1
    ——PowerShell中的赋值不产生任何输出(它们不返回任何内容;它们只更新变量的值)

关于
$i++
(…)
说明:

  • 通过将赋值括在括号(
    (…)
    中,可以将其转换为表达式,这意味着赋值的值将通过,以便它可以参与更大的表达式;例如。:
    • $i=0
      。。。无输出-仅将值
      0
      分配给变量
      $i
    • ($i=1)
      。。。输出
      1
      :由于
      (…)
      ,分配的值也会输出
    • (++$i)
      。。。预增量:将
      $i
      的值增量为
      2
      ,并输出该值
    • ($i++)
      。。。后减量:输出当前值
      2
      ,然后将值增加到
      3
关于
($i++)
$(…)
说明

  • $(…)
    ,即
    ,用于在不直接支持语句的上下文中嵌入一个或多个语句的输出。值得注意的是,您可以使用它将命令输出嵌入可扩展字符串(
    “…”
    )中,即执行字符串插值。

    • 请注意,
      $(…)
      仅用于嵌入表达式(例如,
      (…)
      中包含的内容)、属性访问(
      $foo.bar
      )、索引(
      $foo[0]
      )和方法调用(
      $foo.Baz()
      )和命令(例如,
      获取日期
      ),而不仅仅是
      中的变量引用“亲爱的,我是$HOME”
      。有关PowerShell中可扩展字符串的更多信息,请参阅
  • 虽然在您的简单示例中不需要严格的可扩展字符串-只要
    ($i++)
    就可以生成看起来相同的输出[1]-
    $(…)
    对于使
    ($i++)
    的值成为更大字符串的一部分非常有用;例如,
    “迭代”($i++)“
    打印
    “迭代0”
    迭代#1“


[1]
($i++)
是一个数字,而
“$($i++)“
是一个字符串,其中数字到字符串的转换是字符串插值的一部分。
虽然这通常会导致相同的控制台输出,但对于非整数,例如
1.2
,它实际上可能会有所不同,因为直接输出应用区域性敏感的字符串化,而字符串插值是区域性不变的。因此,在有效的区域性中,使用
作为小数标记-例如,
fr
1.2
1,2
的形式适当地打印-区域性-到控制台,而
“$(1.2)”
在powershell中总是以
1.2
的形式打印,赋值也是表达式。但是表达式的输出通常不会显示。因为函数中的任何输出都会由它返回

PS C:\users\js> $a = ($b = 1)
PS C:\users\js> $a
1
PS C:\users\js> $b
1    
顺便说一句,$()不仅仅用于内部字符串。您可以将多个语句放在其中,用分号分隔,并使用foreach和if等关键字,然后将其放在可以放置表达式的任何位置(管道)


powershell可以执行
变量压缩
,以便在一个步骤中分配/更新和显示变量。这似乎就是您发布的代码中发生的情况。不需要外部的
“$()”
。您可以将该行替换为
($i++)
并得到相同的结果。:
++
将变量、可赋值属性或数组元素的值增加1。@Lee_Dailey,谢谢,这更有意义now@Matt不,这不是不需要的。您需要它来首先处理制动器内部的内容。否则,只有
$i
将被解释,而
++
将是其中的一部分string.Assignment不是表达式(即有值的表达式),但可以通过将其括在括号中的方式将其转换为表达式。@mklement0赋值通常不会输出其值。但我可以找到它作为表达式而不使用额外括号的示例。
$a=$b=1;
if($a=1){'yes'}
yes,如果不输出它的值,它就不是一个表达式
PS C:\users\js> $(if ($true) { echo hi }; echo there) | measure


Count    : 2
Average  :
Sum      :
Maximum  :
Minimum  :
Property :