2

我有一个包含 Employee 和 Manager 两列的 CSV 文件,我想将它们导入两个变量中,以便稍后在我的脚本中使用。但是,当我运行我的代码时,它只捕获 CSV 中的最后一个数据项,因为前一个数据项正在被覆盖。

$CSVFiles = Import-CSV "C:\T2\EmployeeManager.csv"

ForEach($CSVFile in $CSVFiles)
{
  $Employee = ($CSVFile.Employee); $Manager = ($CSVFile.Manager)
}
4

4 回答 4

5
$Employee = $CSVFiles | Select -Expand Employee
$Manager  = $CSVFiles | Select -Expand Manager
于 2018-07-11T14:24:52.987 回答
3

那是因为每次循环运行时您都会覆盖添加的数据。在 PowerShell 中,+=附加到对象。试试这个 -

$Employee = @()
$Manager = @()

$CSVFiles = Import-CSV "C:\T2\EmployeeManager.csv"

ForEach($CSVFile in $CSVFiles)
{
  $Employee += $CSVFile.Employee; $Manager += $CSVFile.Manager
}
于 2018-07-11T14:08:31.867 回答
2

Vivek Kumar Singh 的有用答案很好地解释了您的方法存在的问题并提供了解决方案。

这是一个更简单的替代方案(PSv3+),因为无论如何您要将整个 CSV 文件加载到(自定义对象)到内存中:

$CSV = Import-CSV "C:\T2\Employee.csv"

$Employees = $CSV.Employee  # collect the Employee column values across all input rows
$Managers  = $CSV.Manager   # ditto for Manager

这种方法利用了 PSv3+成员枚举功能

在 PSv2 中,使用iRon 的有用解决方案


比较解决方案的性能

  • 此答案中的成员枚举解决方案最快,
  • 其次是 iRon 的Select -Expand解决方案
  • 到目前为止, Vivek 的foreach循环是最慢的,尤其是因为使用 +=to(从概念上)扩展数组需要在每次迭代中在幕后创建一个新实例。
于 2018-07-11T15:46:10.383 回答
0

这最终成为我完成最终目标的最终编码。我要感谢我使用的所有海报,从你们所有人那里学到了我想要的解决方案。

$EmployeeLists = @()
$ManagerLists = @()
$Employees = @()
$Managers = @()


$CSVFiles = Import-CSV "C:\T2\EmployeeManager.csv"

ForEach($CSVFile in $CSVFiles)
{
  $EmployeeLists += ($CSVFile.Employee)
}

ForEach($CSVFile in $CSVFiles)
{
  $ManagerLists += ($CSVFile.Manager)
}

$Employees += ForEach ($EmployeeList in $EmployeeLists) { Get-ADUser -Properties * -Filter { DisplayName -like $EmployeeList } | Select SamAccountName -ExpandProperty SamAccountName }
$Managers += ForEach ($ManagerList in $ManagerLists) { Get-ADUser -Properties * -Filter { DisplayName -like $ManagerList } | Select SamAccountName -ExpandProperty SamAccountName }


$EmployeeLists
"`n`n`n"
$Employees
于 2018-07-11T16:41:50.280 回答