从 CSV 文件创建一个数组,该文件每次都可能/可能没有值

Creating an array from a CSV file which may/may not have values each time

提问人:LambyUK 提问时间:5/25/2023 更新时间:5/25/2023 访问量:50

问:

对整个 powershell/脚本游戏相对较新,但喜欢认为我有足够的知识来度过难关。然而,这让我感到沮丧。因此,在我的场景中,我有一个包含新用户的CSV文件。现在,我下面的脚本非常适合做我需要它做的事情。但是,当CSV文件中的字段没有值时,我遇到的问题就来了。例如,我有 5 个用户想要设置属性,但其中只有 3 个用户具有我们想要填充的经理字段。

因此,假设我在 CSV 文件中将 manager 字段留空,然后当我运行脚本时,它会在尝试运行 Set-ADUser 命令时出错。所以我的问题是,我怎样才能正确地构建下面的数组,以允许一个用户有一个空的管理器字段,但下一个用户需要填充相同的值?这几乎就像我需要数组中的if命令一样,如果CSV文件中有值,我只想考虑数组中的属性。不过,我不相信您可以在数组中运行 if 命令。希望我问的有道理。

$newusers = import-csv "c:\file.csv"

foreach ($newuser in $newusers) {

$userprops = @('')

$manager = Get-ADUser -Identity $newuser.Manager | Select -ExpandProperty distinguishedName

$userprops = @{
extensionAttribute9 = $newuser.extatt9
extensionAttribute11 = $newuser.extatt11
extensionAttribute14 = $newuser.extatt14
description = $newuser.Description
l = $newuser.City
title = $newuser.Title
department = $newuser.Department
c = $newuser.Country
physicalDeliveryOfficeName = $newuser.Office
manager = $manager
}

Get-ADUser -Identity $newuser.SamAccountName | Set-ADUser -Replace $userprops -Confirm:$false

}
数组 PowerShell CSV null

评论

0赞 Santiago Squarzon 5/25/2023
这回答了你的问题吗?stackoverflow.com/questions/75934171/......
0赞 LambyUK 5/25/2023
读完之后,看起来确实像是我应该关注的东西。老实说,以前从未听说过这个概念。
0赞 Santiago Squarzon 5/25/2023
仅当 CSV 列与 Set-ADUser 参数不匹配时,才需要哈希表。如果您的 CSV 列匹配,则不需要它

答:

0赞 Keith Langmead 5/25/2023 #1

与其搞砸 csv 内容本身,你有没有尝试过改变你是否首先在 AD 中检查经理?

例如,更改行

$manager = Get-ADUser -Identity $newuser.Manager | Select -ExpandProperty distinguishedName

取而代之的是

If ($newuser.Manager -ne "")
{
    $manager = Get-ADUser -Identity $newuser.Manager | Select -ExpandProperty distinguishedName
}
else
{
    $manager = ""
}

这样,如果 csv 条目有一个 Manager 条目,它将去检索它,如果没有,它将简单地将其设置为“”,因此不会设置任何内容。

评论

0赞 LambyUK 5/25/2023
所以我正在考虑这样的事情,但有两件事我不热衷/不确定。首先,我必须在大约 25 个不同的值上添加这样的检查,我的 CSV 将包含许多 AD 属性。对我来说,这只会让我的剧本变得庞大,我希望能有一种更简洁、更有效的方法来做到这一点。另一件事是,即使返回了 $manager = “” 值,我仍然会尝试将其传递给 Set-AdUser 命令。我希望有一种方法可以尝试设置具有值的变量。
0赞 LambyUK 5/25/2023
我实际上只是尝试了这个。一旦我从CSV文件中取出管理器值并运行它,就会收到以下错误。Set-ADUser:替换 C:\Scripts\newo365mailbox.ps1:46 char:48 + ...计数名称 |Set-ADUser -Replace $dpwprops -Confirm:$false -Add @{prox ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,...~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ncrexx,DC=local:ADUser) [Set-ADUser], ADInvalidOperationException + FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser
0赞 LambyUK 5/25/2023
供进一步参考。.如果我只是尝试直接在 set-aduser 命令上传递管理器值而不是数组的一部分,我会得到以下结果。Set-ADUser:无法解析扩展属性“Manager”中提供的标识信息。原因:“在”DC=sxxon,DC=local“下找不到标识为”的对象”。
1赞 LambyUK 5/25/2023
最近更新...我只是将代码更改为 $manager = $null 而不是 $manager = “”,这次脚本处理得很好。因此,它不喜欢尝试设置空字符串,但可以设置空字符串。
0赞 LambyUK 5/26/2023
有人可以解释以下两个代码片段之间的区别吗?第一部分代码有效。第二个没有,并抱怨一个空值。$manager=$null Set-ADUser “joe.bloggs” -Manager $manager $manager=$null $userprops = @{ manager = $manager } Set-ADUser -替换$userprops