问题描述
我创建了一个函数来导入 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
(或 $script
)scope 在您的函数中创建一个哈希表,如下所示:
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)。