微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决无法访问函数中的 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)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。