我根据下面评论中的回复编辑了我的问题。
我写了一个脚本,从csv文件更新Active Directory。该文件包含许多列,其中一些是空的,这意味着我必须跳过这些列。问题是我不知道提前哪些列是空的,哪些不是,它从文件到文件的变化。该脚本将运行每半小时从人力资源系统拉数据更新AD记录。
CSV文件中的列名与AD中的属性名不匹配,因此为了适应这一点,我创建了一个自定义对象,基本上定义了名称与AD属性名匹配的属性,并将每列的值分配给该对象的属性。这应该允许我使用splatting来更新AD。
要更新的AD对象包含在名为$CurrentADUser的变量中。
自定义对象从CSV记录中获取值,CSV记录从CSV文件中读取并存储在$CSVUserData中-并非所有记录都在这里,一次只有一条记录在此对象中,因此我不需要在此时循环通过文件中的每条记录,因为此脚本是在不同的函数中编写的,该函数被称为CSV文件循环通过记录。
我似乎不能让它工作。脚本没有生成错误,但对象的属性似乎不能被它后面的For each循环识别,它只是在尝试一次后基本上跳过for each循环。
我使用的代码如下,希望有人能为我指出我的错误
Description变量通过组合$CSVUserData.JobTitle和$CSVUserData.Department的值来设置,并且由于AD需要将AD对象插入Manager属性而不是字符串,因此也在此声明之外对其进行操作。其余部分直接来自CSV记录
$ADObjectToUpdate = [PSCustomobject]@{
GivenName = $CSVUserData.FirstName
Surname = $CSVUserData.LastName
Description = $DescriptionString
Title =$CSVUserData.JobTitle
Department = $CSVUserData.Department
Manager = $ADManager **<- this is an AD object**
Company = $CSVUserData.Company
EmployeeID = $CSVUserData.EmployeeNumber
StreetAddress = $CSVUserData.WorkAddress
City = $CSVUserData.City
State = $CSVUserData.State
PostalCode = $CSVUserData.Zip
Country = $CSVUserData.Country
Office = $CSVUserData.Location
LogonWorkstations = $CSVUserData.WorkstationLocation
EmailAddress = $CSVUserData.EmailAddress
}
$setSplat = @{}
ForEach($_ in $ADObjectToUpdate.PSObject.Properties)
{
If(-not([string]::IsnullOrWhiteSpace($_.Value)))
{
$setSplat[$_.Name] = $_.Value
}
}
Set-ADUser -Identity $CurrentADUser @setSplat
我想感谢每一个给我留言的人,有些人对我的这种方法非常有用
1条答案
按热度按时间2w3kk1z51#
如果你想让你的脚本更进一步,你可以设置一个哈希表,用于将CSV列与
Set-ADUser
参数相关联,在左边(哈希表Keys)你可以放置CSV列名称,在右边(哈希表Values)你可以放置参数名称。例如:这个哈希表将位于代码的顶部,在循环之外,然后您可以使用它的键来迭代对象的属性并检查它们的值是否为null或空: