powershell - 为什么更改局部变量值会影响全局副本

标签 powershell

我有一个返回全局变量值的函数。当我将此结果分配给局部变量,并更改局部值时,另一个变量也在更改。

例:

function setGlobal
{
    $temp = @{}

    $temp.id = 50;

    $Global:global1 = $temp;

    return $Global:global1;
}

然后我调用此函数,并设置结果值:

$result = setGlobal
$result.id = 80

现在两个变量具有相同的值。

$Global:global1 # id = 60
$result # id = 60

如何防止这种情况发生?为什么更改本地值会影响全局副本?

最佳答案

原因当然是您没有该对象的两个副本。您有两个对同一个对象(哈希表)的引用。引用被复制,而不是对象。物体就像房子。变量(global1和result)就像张纸一样。我将房子的地址写在我的纸上(global1),然后将地址复制到您的纸上(结果)。然后,转到您拥有的地址并将门漆成红色。现在,当我到达地址时,我的房子现在有一扇红门。

深度复制对象比复制房屋要容易一些。对于任意对象,请使用PSObject.Copy():

function setGlobal
{
    $temp = @{}
    $temp.id = 50;
    $Global:global1 = $temp;
    return $Global:global1.PSObject.Copy();
}

在这种情况下,这与Clone完全相同,因为PSObject.Copy使用Clone(如果可用)。

关于powershell - 为什么更改局部变量值会影响全局副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30656546/

相关文章:

windows - 与 Powershell 连接时的编码问题

Powershell ISE缓存变量值?

powershell - 如何定义函数的返回类型/OutputType

node.js - 如何在 node.js 的子生成过程中捕获 PowerShell Write-Progress 文本?

Powershell下载并运行exe文件

powershell - Jfrog CLI 不遵守配置的 API key

php - 从 php 文件执行 Powershell 脚本

powershell - AWS PowerShell 使用-STSRole : The security token included in the request is invalid

powershell - 如何处理不同的路径分隔符?

powershell - 引号没有关闭文件路径?