【发布时间】:2021-04-28 12:10:58
【问题描述】:
我在我的一个脚本中发现了一个错误,看起来 PowerShell(2.0 版)在再次输入函数时没有重新初始化本地数组。这是一个极简主义的例子:
function PrintNumbersUntilX {
param (
[ Parameter( Mandatory = $true ) ] $X
)
$Number = 0
while( $Number -le $X ) {
Write-Host $Number
$Number++
}
}
function PrintNumbersUntilY {
param (
[ Parameter( Mandatory = $true ) ] $Y
)
$Number = ( , 0 )
while( $Number[ 0 ] -le $Y ) {
Write-Host $Number[ 0 ]
$Number[ 0 ]++
}
}
function Main {
Write-Host 'X-3: '
PrintNumbersUntilX -X 3
Write-Host 'X-12: '
PrintNumbersUntilX -X 12
Write-Host 'Y-3: '
PrintNumbersUntilY -Y 3
Write-Host 'Y-12: '
PrintNumbersUntilY -Y 12
}
Main
输出(用空格替换换行符):
X-3: 0 1 2 3 X-12: 0 1 2 3 4 5 6 7 8 9 10 11 12 Y-3: 0 1 2 3 Y-12: 4 5 6 7 8 9 10 11 12
PrintNumbersUntilX 按我对局部变量的预期工作,但 PrintNumbersUntilY 不会重置(重新初始化)$Number
此错误是否已在以后的版本中修复,或者这是一个“功能”,如果是,它叫什么,我怎样才能摆脱它?
【问题讨论】:
-
这是特定于 2.0 的(在以后的版本中可以以
-version 2开头,但不是其他的),但即使在那里它也可以通过使用$Number = @(0)来修复(这是声明数组,即使偶尔需要逗号技巧来防止在更复杂的情况下展开)。 -
关于 v2 特定的错误的好点,@JeroenMostert,但
@(...)不是在 PowerShell 中声明数组的正确方法,因为它通常是不必要的并且可能会引起概念上的混淆 - 请看我的回答。, 0在这种情况下不是技巧,它是正确使用数组构造运算符的一元形式来构造单元素数组。
标签: powershell local-variables