Powershell 什么';“这背后的魔力是什么?”$($i+;+;)”什么;?
下面是一段代码,它以1秒的间隔输出Powershell 什么';“这背后的魔力是什么?”$($i+;+;)”什么;?,powershell,Powershell,下面是一段代码,它以1秒的间隔输出13… while ($true) { sleep -s 1 "$(($i++))" } 怎么可能呢?评论中有一些很好的建议,但让我再深入一点: 解释$i++: $i++使用++,将变量$i的值增加1,这可能是C#和C/C++等语言所熟悉的。正如预期的那样,还存在一个完整的基本减量运算符(--) 由于++位于变量之后(后缀形式),因此在语句中使用变量的值之后会发生递增;将其放在变量-+$i(前缀形式)之前将首先执行递增操作;如果在中单独使用递增/递
13…
while ($true) {
sleep -s 1
"$(($i++))"
}
怎么可能呢?评论中有一些很好的建议,但让我再深入一点: 解释
$i++
:
使用$i++
,将变量++
的值增加$i
,这可能是C#和C/C++等语言所熟悉的。正如预期的那样,还存在一个完整的基本减量运算符(1
)--
- 由于
位于变量之后(后缀形式),因此在语句中使用变量的值之后会发生递增;将其放在变量-++
(前缀形式)之前将首先执行递增操作;如果在中单独使用递增/递减操作,则该区别无关+$i
假定包含数字类型的实例,否则会发生错误;如果变量$i
尚未初始化,则其值实际上是$i
,PowerShell会强制该变量为$null
-键入的[int]
。因此,0
在其语句的上下文中计算为$i++
,然后递增为0
1
- 由于
- 递增/递减表达式(如
)被视为赋值处理——您可以将其视为$i++
——PowerShell中的赋值不产生任何输出(它们不返回任何内容;它们只更新变量的值)$i=$i+1
$i++
的(…)
说明:
- 通过将赋值括在括号(
)中,可以将其转换为表达式,这意味着赋值的值将通过,以便它可以参与更大的表达式;例如。:(…)
。。。无输出-仅将值$i=0
分配给变量0
$i
。。。输出($i=1)
:由于1
,分配的值也会输出李>(…)
。。。预增量:将(++$i)
的值增量为$i
,并输出该值李>2
。。。后减量:输出当前值($i++)
,然后将值增加到2
3
($i++)
的$(…)
说明
,即,用于在不直接支持语句的上下文中嵌入一个或多个语句的输出。值得注意的是,您可以使用它将命令输出嵌入可扩展字符串($(…)
)中,即执行字符串插值。“…”
- 请注意,
仅用于嵌入表达式(例如,$(…)
中包含的内容)、属性访问((…)
)、索引($foo.bar
)和方法调用($foo[0]
)和命令(例如,$foo.Baz()
),而不仅仅是获取日期
。有关PowerShell中可扩展字符串的更多信息,请参阅中的变量引用“亲爱的,我是$HOME”
- 请注意,
- 虽然在您的简单示例中不需要严格的可扩展字符串-只要
就可以生成看起来相同的输出[1]-($i++)
对于使$(…)
的值成为更大字符串的一部分非常有用;例如,($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 :