首页 > 解决方案 > Powershell,CSV 导入

问题描述

我在处理 CSV 文件方面不是很有经验,现在我有点难以让这个小型私人项目正常工作。

我制作了一个脚本来检查运行脚本的用户,然后从 AD 获取用户所属的部门编号。然后我想根据 CSV 文件测试该部门编号以获得正确的部门名称。

CSV 文件如下所示:

111;DepartmentBlue
222;DepartmentRed
333;DepartmentGreen

如何让我的脚本检查我从 AD 获得的部门编号是否存在于第 1 列的此 CSV 文件中,然后返回部门名称(第 2 列)?

这就是我得到的:

Function outputData {
$outputUser.Text = ((Get-ADUser -Identity $env:username -Properties SamAccountName).SamAccountName)
$outputDep.Text = ((Get-ADUser -Identity $env:username -Properties Department).Department)

$dep = $outputDep.Text
$source = Import-Csv -Path "C:\temp\Script\departments.csv"
foreach($i in $source){
    if($dep -eq $i){
       #give me the department name
    }
}
}

标签: powershellcsvactive-directory

解决方案


修改您当前的代码,您可以尝试以下操作:

Function outputData {

$ADUser = Get-ADUser -Identity $env:username -Properties Department
$dep = $ADUser.Department
$username = $ADUser.SamAccountName # Doesn't seem to be needed
$source = Import-Csv -Path "C:\temp\Script\departments.csv" -Delimiter ';'
foreach($i in $source){
    if($dep -eq $i.departmentNumber){
       $i.departmentName
    }
}

}

outputData

所有这些都假定 CSV 文件的第一行是DepartmentNumber;DepartmentName. 或者,您可以保留不带标题的 CSV 文件,并将-Header参数添加到您的Import-Csv命令中,如下所示:

Function outputData {

$ADUser = Get-ADUser -Identity $env:username -Properties Department
$dep = $ADUser.Department
$source = Import-Csv -Path "C:\temp\Script\departments.csv" -Delimiter ';' -Header "DepartmentNumber","DepartmentName"
foreach($i in $source){
    if($dep -eq $i.departmentNumber){
       $i.departmentName
    }
}

}

outputData

这一切都假设DepartmentAD 中的属性包含部门编号值,目标是在 CSV 文件中查找相同的编号并在同一行返回相应的部门名称。这段代码没有一个是有效的。我们可以用更少的循环来实现这一点。

.where()没有循环和使用该函数的替代方法如下:

Function outputData {

$ADUser = Get-ADUser -Identity $env:username -Properties Department
$dep = $ADUser.Department
$source = Import-Csv -Path "C:\temp\Script\departments.csv" -Delimiter ';' -Header "DepartmentNumber","DepartmentName"
$source.where({$_.departmentnumber -eq $dep},'First').departmentname

}
outputData

另一种选择是使用字符串到哈希表的转换,如下所示:

Function outputData {

$ADUser = Get-ADUser -Identity $env:username -Properties Department
$dep = $ADUser.Department
$source = (gc c:\temp\test1\test2.csv -raw) -replace ';','=' | ConvertFrom-StringData
$source[$dep]
}
outputData

推荐阅读