即使未调用,带有PSCustomObjects的数组也会更改值

时间:2018-06-28 11:49:51

标签: powershell scope

我编写了一个脚本(PowerShell≥3),该脚本基本上会查找某些文件,然后检查文件名是否已在以后将文件复制到的路径中使用,如果是,它将_OutCopy添加到名字。 它的作用还不止于此,但这与这个问题无关。

#requires -version 3

Function Start-FileSearch(){
    param(
        [string]$InputPath = $(throw 'InputPath not set'),
        [string]$Format = $(throw 'Format not set')
    )
    $InFiles = @()
    $InFiles = @(Get-ChildItem -LiteralPath $InputPath -Filter $Format -Recurse -File | ForEach-Object {
        [PSCustomObject]@{
            InFullName = $_.FullName
            OutName = "ZYX"
        }
    })
    return $InFiles
}

Function Start-OverwriteProtection(){
    param(
        [string]$OutputPath = $(throw 'OutputPath not set'),
        [array]$InFiles = $(throw 'InFiles not set')
    )

    $NewFiles = $InFiles

    for($i=0; $i -lt $NewFiles.Length; $i++){
        $NewFiles[$i].OutName = "$($NewFiles[$i].OutName)_OutCopy"  # this, of course, is simplified. 
    }
    return $NewFiles
}

Function Start-AllStuff() {
    $InFiles = @(Start-FileSearch -InputPath "D:\Temp\In_Test" -Format "*.jpg")
    $InFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host

    $NewFiles = @(Start-OverwriteProtection -OutputPath "D:\Temp" -InFiles $InFiles)
    $InFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
    $NewFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
}

Start-AllStuff

很明显,第二个$InFiles | Format-Table也应该为"ZYX"输出.OutName-但是,它包括已经更改的值。

我尝试过的事情:

  • 将所有变量放在private:范围内,
  • 将命令放在第三个函数Start-Allstuff()的内部/外部,
  • 为每个用例重命名变量(即始终使用$InFiles)/不重命名变量(即如上所示,$NewFiles)。
  • 创建变量后调用它们(即$InFiles = @(Start-FileSearch [...] ); $InFiles

没有帮助。

到目前为止,我的理解是,如果不直接调用变量,则不可能更改。 (例如$InFiles = $OutFiles应该更改左侧的变量,而不是右侧的变量。)

我在这里想念什么?

对于所有想知道的人:是的,我进一步研究了previous question ("Compare-Object does not work with PSCustomObjects from another script")的问题,发现这一定是它不起作用的原因-至少这是原因之一

1 个答案:

答案 0 :(得分:1)

iRon是正确的,您需要克隆PSObject,下面的代码。

$NewFiles = $InFiles
$NewInFiles = $InFiles | select *

for($i=0; $i -lt $NewFiles.Length; $i++){
.........................
$NewFiles = @(Start-OverwriteProtection -OutputPath "D:\" -InFiles $InFiles)
$NewInFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host
$NewFiles | Format-Table -AutoSize -Property OutName,InFullName | Out-Host

看起来您的for循环正在修改$ InFiles,请查看我的结果。经过随机图像测试。

$Infiles outside For loop

$Infiles inside For loop