gpt4 book ai didi

powershell - 在PowerShell中,每次执行脚本时,数组都会变大

转载 作者:行者123 更新时间:2023-12-03 00:31:41 30 4
gpt4 key购买 nike

所以我从PowerShell开始,这对我来说很奇怪。我在最后一行放置一个断点,当我运行脚本$ newArray为“abc”时,它会在Write-Output中暂停,并停止调试器。如果我再次运行它,则$ newArray为“abcabc”,依此类推。首先,我认为我做错了,因为这种行为对我来说很奇怪,就像它在停止调试器的情况下存储在内存中一样。其次,我希望$ newArray是一个数组,而不是具有连接值的单个字符串。有什么线索吗?

$array = "a", "b", "c";
$newArray;
foreach ($item in $array )
{
$newArray += $item
}
Write-Output "Just before ending script";

最佳答案

tl;博士

  • 为了使用+=迭代地构建数组,您必须(重新)将目标变量初始化为一个空数组:$newArray = @() ;如果不这样做,请参阅底部。
  • Re 重复调试传递了:不幸的是,obsolescent Windows PowerShell ISEPowerShell extensionVisual Studio Code都在同一 session 中运行,因此后续的后续调用可能会受到先前的状态的影响。但是,可以将Visual Studio PowerShell扩展配置为每次时使用新 session -请参见this answer

  • 就是说,通常最好不要使用+=,因为它效率不高:在每次迭代中都需要在幕后创建一个新数组,因为.NET数组是不可变的数据结构(就元素计数而言)。
  • 在您的简单情况下,您可以简单地使用以下内容通过 $arrayarray-subexpression operator 创建ozt_code的(浅)副本,该副本隐式地克隆一个数组:
  • @()

  • 如果您需要对源数组的每个元素执行操作,则可以利用以下事实:可以将$newArray = @($array)循环用作表达式,该表达式隐式地将迭代的输出收集在数组中-假设存在一个以上的输出:
  • foreach
  • 注意[array] $newArray = foreach ($item in $array) { $item + '!' }类型约束,即使[array]循环恰好只输出一个对象,它也可以确保$newArray接收一个数组;或者,您可以将循环包装为foreach



  • @(...)的工作方式:
    简而言之:如果您使用+=添加到未初始化变量的第一个值是字符串,则该字符串按原样存储,并且所有后续+=操作均执行字符串连接;特别:
  • +=$newArray += $item的语法糖。
  • 如果尚未定义$newArray = $newArray + $item,则其隐含值为$newArray [1]。
  • 因为您的$null值是字符串($item),所以第一次迭代中的[string]等于$newArray += $item,它将$newArray = $null + "a"(单个字符串)分配给"a"(使用$newArray RHS,LHS上的[string]被视为空字符串,执行字符串连接在这种情况下有效返回RHS字符串)。
  • 第二次迭代等于$null,如果LHS是字符串,则再次执行字符串连接,以便$newArray = "a" + "b"之后包含$newArray
  • 第三(以及任何假设的后续迭代)只需继续追加到"ab"中存储的字符串即可。

  • 一般来说:
  • $newArray的第一个+=迭代中,对$initiallyUninitialized += <value>进行评估,它将$null + <value>存储在<value>中,并根据碰巧的$initiallyUninitialized类型有效地对其进行键入。
  • 在随后的<value>迭代中,+=值的当时当前类型确定隐式$initiallyUninitialized操作的结果-通常(但不一定)保留该类型:
  • 如果是数字类型,则类型可能会自动加宽:
  • $initiallyUninitialized + <value>-$a += [int]::MaxValue; $a += [int]::MaxValue现在为$a类型。

  • 如果无法执行[double]操作,则该操作可能会失败,并出现语句终止错误:
  • +-导致语句终止错误,因为无法添加两个$a += Get-Date; $a += Get-Date实例([datetime])。



  • [1]默认情况下适用(+);如果使用Set-StrictMode -Off或更高版本,您实际上会收到一条语句终止错误。

    关于powershell - 在PowerShell中,每次执行脚本时,数组都会变大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63661810/

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