无法访问函数中的 Powershell 哈希表

问题描述

我创建了一个函数来导入 HR 记录,以便通过索引员工 ID 轻松访问它们。

getUser(email: required<TUser>['email'])

我想在函数外使用 $hrData 变量。我无法引用 $hrData['employeeID'],因为我读到函数中的变量不存在于函数之外。我尝试过的一件事是创建另一个函数来将员工 ID 传递到 $hrData 哈希表中:

function hrDataimport {
$HRFile=Import-Csv $rawHRFile #$rawHRFile path prevIoUsly defined
Write-Host "Creating HR hash table..."
$hrData = @{}
$HRFile | ForEach-Object { $hrData[$_.employeeID] = $_ }
Write-Host "Done. " $hrData.Count
    }

我把函数放在一个模块中并成功导入。我能够很好地执行 importHRData ,但是当我尝试 function showHRData { param ([string]$hrUser) $hrData[$hrUser] } 时,我得到“无法索引到空数组”。似乎该函数没有看到前一个函数中的哈希表变量。我做错了什么,或者您有什么建议,以便我可以跨各种脚本访问 $hrData 哈希表?

解决方法

您可以使用 $global(或 $scriptscope 在您的函数中创建一个哈希表,如下所示:

function hrDataImport {
    $HRFile = Import-Csv $rawHRFile #$rawHRFile path previously defined
    Write-Host "Creating HR hash table..."
    if (!$hrData) { $Global:hrData = @{} }
    $HRFile | ForEach-Object { $Global:hrData[$_.employeeID] = $_ }
    Write-Host "Done. " $hrData.Count
}

但一般情况下,建议避免使用全局(或脚本)范围,主要是因为它可能与当前范围内的变量发生冲突。
为了尽量减少这种可能性,我会考虑将您的函数的职责更改为不仅加载信息,还接收相关的 employeeID,例如:

function Get-EmployeeData ($EmployeeID) {
    if (!$StaticEmployeeData) {
        Write-Host "Creating HR hash table..."
        $HRFile = Import-Csv $rawHRFile #$rawHRFile path previously defined
        $Global:StaticEmployeeData = @{}
        $HRFile | ForEach-Object { $Global:StaticEmployeeData[$_.employeeID] = $_ }
        Write-Host "Done. " $StaticEmployeeData.Count
    }
    $Global:StaticEmployeeData[$employeeID]
}

function showHRData {
    param ([string]$hrUser)
    Get-EmployeeData $hrUser
}

在这种情况下,您可以选择更具体的全局变量名称(例如 $StaticEmployeeData,知道 PowerShell 不支持诸如 static variable 之类的东西)并且作为额外奖励,数据是 在您第一次真正需要它时加载(lazy evaluation)。