Arrays 获取空值不确定原因

Arrays 获取空值不确定原因,arrays,powershell,import-csv,Arrays,Powershell,Import Csv,我的剧本有一个奇怪的问题。它可以创建用户,但当我添加组成员时,它似乎无法正常工作。这很奇怪,我不明白为什么会出现空值错误 $Path = "C:\T2\BulkUsers\AccountProvisioningTemplate.csv" $CSVs = Import-CSV $Path $Group1 = 'G1' $Group2 = "G2" $FirstNames = @() $Initials = @() $LastNames = @() $FullNames = @() $Displa

我的剧本有一个奇怪的问题。它可以创建用户,但当我添加组成员时,它似乎无法正常工作。这很奇怪,我不明白为什么会出现空值错误

$Path = "C:\T2\BulkUsers\AccountProvisioningTemplate.csv"
$CSVs = Import-CSV $Path
$Group1 = 'G1'
$Group2 = "G2"

$FirstNames = @()
$Initials = @()
$LastNames = @()
$FullNames = @()
$DisplayNames = @()
$EmployeeNumbers = @()
$TelephoneNumbers = @()
$SAMs = @()
$UPNs = @()
$Companys = @()
$Departments = @()
$Offices = @()
$Citys = @()
$States = @()
$Zips = @()
$Titles = @()
$Contractor = @()


ForEach($CSV in $CSVs) { $FirstNames += ($CSV.FirstName) }
ForEach($CSV in $CSVs) { $Initials += ($CSV.Initials) }
ForEach($CSV in $CSVs) { $LastNames += ($CSV.LastName) }
ForEach($CSV in $CSVs) { $FullNames += ($CSV.FullName) }
ForEach($CSV in $CSVs) { $DisplayNames += ($CSV.DisplayName) }
ForEach($CSV in $CSVs) { $EmployeeNumbers += ($CSV.EmployeeNumber) }
ForEach($CSV in $CSVs) { $TelephoneNumbers += ($CSV.TelephoneNumber) }
ForEach($CSV in $CSVs) { $SAMs += ($CSV.SAM) }
ForEach($CSV in $CSVs) { $UPNs += ($CSV.UPN) }
ForEach($CSV in $CSVs) { $Companys += ($CSV.Company) }
ForEach($CSV in $CSVs) { $Departments += ($CSV.Department) }
ForEach($CSV in $CSVs) { $Offices += ($CSV.Office) }
ForEach($CSV in $CSVs) { $Citys += ($CSV.City) }
ForEach($CSV in $CSVs) { $States += ($CSV.State) }
ForEach($CSV in $CSVs) { $Zips += ($CSV.Zip) }
ForEach($CSV in $CSVs) { $Titles += ($CSV.Title) }
ForEach($CSV in $CSVs) { $Contractor += ($CSV.Contractor) }

$FN = 0
$IN = 0
$LN = 0
$FN1 = 0
$DN = 0
$EN = 0
$TN = 0
$S = 0
$U = 0
$Comp = 0
$Dept = 0
$Off = 0
$C = 0
$S = 0
$Z = 0
$T = 0
$ConC = 0
$Con = "No"

$OU = "OU=General Users & Computers,DC=corp,DC=abc,DC=com"
$Password1 = ConvertTo-SecureString "Changeme123" -AsPlainText -Force

ForEach($CSV in $CSVs) { New-ADUser -GivenName $CSVs.FirstName[$FN] -Initials $CSVs.Initials[$IN] -Surname $CSVs.LastName[$LN] -name $CSVs.FullName[$FN1] -DisplayName $CSVs.DisplayName[$DN] -EmployeeID $CSVs.EmployeeNumber[$EN] -EmployeeNumber $CSVs.EmployeeNumber[$EN] -OfficePhone $CSVs.TelephoneNumber[$TN] -SamAccountName $CSVs.SAM[$S] -UserPrincipalName $CSVs.UPN[$U] -Path $OU -Company $CSVs.Company[$Comp] -Department $CSVs.Department[$Dept] -Office $CSVs.Office[$Off] -City $CSVs.City[$C] -State $CSVs.State[$S] -PostalCode $CSVs.Zip[$Z] -Title $CSVs.Title[$T] -AccountExpirationDate $null -AccountPassword $Password1 -CannotChangePassword $False -ChangePasswordAtLogon $False -Enabled $True; $FN++; $IN++; $LN++; $FN1++; $DN++; $EN++; $TN++; $S++; $U++; $Comp++; $Dept++; $Off++; $C++; $S++; $Z++; $T++ }

Start-Sleep 2

ForEach($CSV in $CSVs) { IF ($Contractor[$ConC] -Match $Con) { Add-ADGroupMember -Identity $Group1 -Members $CSVs.SAM[$S]; Add-ADGroupMember -Identity $Group2 -Members $CSVs.SAM[$S]; $S++ } ELSE { $S++ } ; $CSVs.SAM[$S]; $SAMs[$S]; $ConC++ }
我收到了错误消息,我不知道为什么。它可以创建用户,当我输入对$SAMs[$]的引用时,它会在CSV中报告用户的正确SamAccountName

Add-ADGroupMember : Cannot validate argument on parameter 'Members'. The argument is null or empty. Provide an
argument that is not null or empty, and then try the command again.
At C:\T2\BulkUsers\BulkUserImport.ps1:69 char:120
+ ... roup1 -Members $SAMs[$S]; Add-ADGroupMember -Identity $Group2 -Members $SAMs[$S] ...
+                    ~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Add-ADGroupMember], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.AddADGrou
   pMember

Add-ADGroupMember : Cannot validate argument on parameter 'Members'. The argument is null or empty. Provide an
argument that is not null or empty, and then try the command again.
At C:\T2\BulkUsers\BulkUserImport.ps1:69 char:176
+ ... roup2 -Members $SAMs[$S]; $S++ } ELSE { $S++ } ; $ConC++ }
+                    ~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Add-ADGroupMember], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.AddADGrou
   pMember

Add-ADGroupMember : Cannot validate argument on parameter 'Members'. The argument is null or empty. Provide an
argument that is not null or empty, and then try the command again.
At C:\T2\BulkUsers\BulkUserImport.ps1:69 char:120
+ ... roup1 -Members $SAMs[$S]; Add-ADGroupMember -Identity $Group2 -Members $SAMs[$S] ...
+                    ~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Add-ADGroupMember], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.AddADGrou
   pMember

Add-ADGroupMember : Cannot validate argument on parameter 'Members'. The argument is null or empty. Provide an
argument that is not null or empty, and then try the command again.
At C:\T2\BulkUsers\BulkUserImport.ps1:69 char:176
+ ... roup2 -Members $SAMs[$S]; $S++ } ELSE { $S++ } ; $ConC++ }
+                    ~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Add-ADGroupMember], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.AddADGrou
   pMember

有趣的是,如果我注释掉用户创建部分,我会得到正确的SAM帐户名,但如果它运行,我什么也得不到。

写一个答案,给出一个代码示例

正如Mathias所说,你太努力了,我不知道你为什么会出错,但我相信你应该对用户的所有属性只做一次foreach

CSV文件:

Firstname|Lastname|OU|SAM|Description|Password
John|Smith01|"OU=Users,DC=domain,DC=com"|John.Smith01|Test Account 01|Passw0rd
John|Smith02|"OU=Users,DC=domain,DC=com"|John.Smith01|Test Account 02|Passw0rd
John|Smith03|"OU=Users,DC=domain,DC=com"|John.Smith01|Test Account 03|Passw0rd
John|Smith04|"OU=Users,DC=domain,DC=com"|John.Smith01|Test Account 04|Passw0rd
John|Smith05|"OU=Users,DC=domain,DC=com"|John.Smith01|Test Account 05|Passw0rd
代码:

希望这能帮助您解决问题,让您的用户能够正常运行。
如果需要添加组,也可以使用Add-ADGroupMember/Remove-ADGroupMember命令进行添加。

以下是正确的代码。马蒂亚斯,请给出一个简单的答案

“这是因为$s的值大于 数组,因此$SAMs[$S]将导致$null。您需要重新设置它 在你开始睡觉的同时”

所以我可以给你荣誉。我确实犯了一些错误。就像我双重使用了变量$S,该变量已更改为$SAM,以避免与状态$S冲突。此外,我的CSV有点抬高,但主要问题是未能清除$S($SAM)的值,这是关键。如果您像我一样分解代码,很容易忘记这样做

现在我将不得不用谷歌搜索什么是铺张浪费,因为这是我第一次听到这个词

不过,我想用几句话向所有感到沮丧的人解释,为什么我把事情弄得如此复杂。实际上有三个不同的原因

1) 我不是一个超级熟练的powershell编剧。是的,我不是一个试图写主持人“Hello World”的noob,但我也不是一个程序员,很明显,我来这里是向像你们这样的先生们和女士们学习,他们显然比我更精通Powershell

2) 第二,这是我作为一个人的思考方式。我喜欢把问题分解成小块来解决它们。我也喜欢把解决方案组装成一个整体。我意识到,当我需要从几个月或几年前编写的脚本中提取项目时,尽管我可以通过在一天结束时遵循您的风格来减少行数并提高效率,但我不必努力解码我所采取的步骤。我可以看到每一段代码,以及它作为一组代码所做的事情。我承认我可能可以将变量从创建用户传递到添加成员,或者更好地从CSV读取,但这是我第一次从CSV自动创建active directory帐户,因此我必须学习如何分步执行。我发布了前一个问题,帮助我将CSV数据加载到数组中。我还了解到,我可以使用列标题引用CSV数据。剧本是一次很好的学习经历。此外,它还没有完成。我现在必须添加Exchange资源调配步骤,因此我还必须学习如何将Exchange会话正确加载到现有的Powershell中。这是我去年几周来一直在努力解决的问题,但始终没有完全正确

3) 第三个也是最后一个原因是,有一天我可能会离开这份工作,我希望在我之后的IT团队(他们可能没有我那样的能力编写脚本)能够将这些内容分解成碎片,并看到这些部分组合在一起,以便他们能够学习和维护我所写的内容。有时当我在这里读代码的时候,我学到了很多(但是我在PixBar上有一个坚实的基础)。尽管我必须承认,你们写的一些代码对我来说仍然像是黑魔法,因为它是如此强大,同时又如此简单。各位先生女士都很有才华,我感谢你们给我的所有帮助。我希望有一天能达到你的水平,但事实上我不是一个脚本或程序员的贸易。我是Active Directory、Exchange、SAN、虚拟化、Citrix和总体基础架构工程师。在过去一年左右的时间里,我开始认真学习Powershell,这意味着我基本上是一个脚本游戏的幼儿。我正在尽我所能地成长,你的每一点知识都会对我有所帮助,但我写这篇文章的目的是试图说服你接受这样一个事实,即你们的水平比我们中的一些人更高,如果你能接受这一点,那么也许你会明白为什么我没有做你在特定情况下会做的事情

无论如何,这里是我承诺的最终代码

$Path = "C:\T2\BulkUsers\AccountProvisioningTemplate.csv"
$CSVs = Import-CSV $Path
$Group1 = 'G1'
$Group2 = "G2"

$FirstNames = @()
$Initials = @()
$LastNames = @()
$FullNames = @()
$DisplayNames = @()
$EmployeeNumbers = @()
$TelephoneNumbers = @()
$SAMs = @()
$UPNs = @()
$Companys = @()
$Departments = @()
$Offices = @()
$Citys = @()
$States = @()
$Zips = @()
$Titles = @()
$Contractor = @()


ForEach($CSV in $CSVs) { $FirstNames += ($CSV.FirstName) }
ForEach($CSV in $CSVs) { $Initials += ($CSV.Initials) }
ForEach($CSV in $CSVs) { $LastNames += ($CSV.LastName) }
ForEach($CSV in $CSVs) { $FullNames += ($CSV.FullName) }
ForEach($CSV in $CSVs) { $DisplayNames += ($CSV.DisplayName) }
ForEach($CSV in $CSVs) { $EmployeeNumbers += ($CSV.EmployeeNumber) }
ForEach($CSV in $CSVs) { $TelephoneNumbers += ($CSV.TelephoneNumber) }
ForEach($CSV in $CSVs) { $SAMs += ($CSV.SAM) }
ForEach($CSV in $CSVs) { $UPNs += ($CSV.UPN) }
ForEach($CSV in $CSVs) { $Companys += ($CSV.Company) }
ForEach($CSV in $CSVs) { $Departments += ($CSV.Department) }
ForEach($CSV in $CSVs) { $Offices += ($CSV.Office) }
ForEach($CSV in $CSVs) { $Citys += ($CSV.City) }
ForEach($CSV in $CSVs) { $States += ($CSV.State) }
ForEach($CSV in $CSVs) { $Zips += ($CSV.Zip) }
ForEach($CSV in $CSVs) { $Titles += ($CSV.Title) }
ForEach($CSV in $CSVs) { $Contractor += ($CSV.Contractor) }

$FN = 0
$IN = 0
$LN = 0
$FN1 = 0
$DN = 0
$EN = 0
$TN = 0
$SAM = 0
$U = 0
$Comp = 0
$Dept = 0
$Off = 0
$C = 0
$S = 0
$Z = 0
$T = 0


$OU = "OU=General Users & Computers,DC=corp,DC=abc,DC=com"
$Password1 = ConvertTo-SecureString "Changeme123" -AsPlainText -Force

ForEach($CSV in $CSVs) { New-ADUser -GivenName $CSVs.FirstName[$FN] -Initials $CSVs.Initials[$IN] -Surname $CSVs.LastName[$LN] -name $CSVs.FullName[$FN1] -DisplayName $CSVs.DisplayName[$DN] -EmployeeID $CSVs.EmployeeNumber[$EN] -EmployeeNumber $CSVs.EmployeeNumber[$EN] -OfficePhone $CSVs.TelephoneNumber[$TN] -SamAccountName $CSVs.SAM[$SAM] -UserPrincipalName $CSVs.UPN[$U] -Path $OU -Company $CSVs.Company[$Comp] -Department $CSVs.Department[$Dept] -Office $CSVs.Office[$Off] -City $CSVs.City[$C] -State $CSVs.State[$S] -PostalCode $CSVs.Zip[$Z] -Title $CSVs.Title[$T] -AccountExpirationDate $null -AccountPassword $Password1 -CannotChangePassword $False -ChangePasswordAtLogon $False -Enabled $True; $CSVs.SAM[$SAM]; $SAM; $FN++; $IN++; $LN++; $FN1++; $DN++; $EN++; $TN++; $SAM++; $U++; $Comp++; $Dept++; $Off++; $C++; $S++; $Z++; $T++ }

Start-Sleep 2

$ConC = 0
$Con = "No"
$SAM = 0

 "`n`n"

ForEach($CSV in $CSVs) { IF ($Contractor[$ConC] -Match $Con) { Add-ADGroupMember -Identity $Group1 -Members $CSVs.SAM[$SAM]; Add-ADGroupMember -Identity $Group2 -Members $CSVs.SAM[$SAM]; $SAM++ } ELSE { $SAM++ } ; $ConC++ }

你能举个例子说明文本文件中的内容吗?这是因为
$s
的值大于数组的长度,所以
$SAMs[$s]
会导致
$null
。您需要在开始睡眠的同时“重置”它。。。但你为什么要把这件事弄得如此复杂?这可能是我建议使用的一个循环。Splatting使您的命令更短,更易于阅读。
$Path = "C:\T2\BulkUsers\AccountProvisioningTemplate.csv"
$CSVs = Import-CSV $Path
$Group1 = 'G1'
$Group2 = "G2"

$FirstNames = @()
$Initials = @()
$LastNames = @()
$FullNames = @()
$DisplayNames = @()
$EmployeeNumbers = @()
$TelephoneNumbers = @()
$SAMs = @()
$UPNs = @()
$Companys = @()
$Departments = @()
$Offices = @()
$Citys = @()
$States = @()
$Zips = @()
$Titles = @()
$Contractor = @()


ForEach($CSV in $CSVs) { $FirstNames += ($CSV.FirstName) }
ForEach($CSV in $CSVs) { $Initials += ($CSV.Initials) }
ForEach($CSV in $CSVs) { $LastNames += ($CSV.LastName) }
ForEach($CSV in $CSVs) { $FullNames += ($CSV.FullName) }
ForEach($CSV in $CSVs) { $DisplayNames += ($CSV.DisplayName) }
ForEach($CSV in $CSVs) { $EmployeeNumbers += ($CSV.EmployeeNumber) }
ForEach($CSV in $CSVs) { $TelephoneNumbers += ($CSV.TelephoneNumber) }
ForEach($CSV in $CSVs) { $SAMs += ($CSV.SAM) }
ForEach($CSV in $CSVs) { $UPNs += ($CSV.UPN) }
ForEach($CSV in $CSVs) { $Companys += ($CSV.Company) }
ForEach($CSV in $CSVs) { $Departments += ($CSV.Department) }
ForEach($CSV in $CSVs) { $Offices += ($CSV.Office) }
ForEach($CSV in $CSVs) { $Citys += ($CSV.City) }
ForEach($CSV in $CSVs) { $States += ($CSV.State) }
ForEach($CSV in $CSVs) { $Zips += ($CSV.Zip) }
ForEach($CSV in $CSVs) { $Titles += ($CSV.Title) }
ForEach($CSV in $CSVs) { $Contractor += ($CSV.Contractor) }

$FN = 0
$IN = 0
$LN = 0
$FN1 = 0
$DN = 0
$EN = 0
$TN = 0
$SAM = 0
$U = 0
$Comp = 0
$Dept = 0
$Off = 0
$C = 0
$S = 0
$Z = 0
$T = 0


$OU = "OU=General Users & Computers,DC=corp,DC=abc,DC=com"
$Password1 = ConvertTo-SecureString "Changeme123" -AsPlainText -Force

ForEach($CSV in $CSVs) { New-ADUser -GivenName $CSVs.FirstName[$FN] -Initials $CSVs.Initials[$IN] -Surname $CSVs.LastName[$LN] -name $CSVs.FullName[$FN1] -DisplayName $CSVs.DisplayName[$DN] -EmployeeID $CSVs.EmployeeNumber[$EN] -EmployeeNumber $CSVs.EmployeeNumber[$EN] -OfficePhone $CSVs.TelephoneNumber[$TN] -SamAccountName $CSVs.SAM[$SAM] -UserPrincipalName $CSVs.UPN[$U] -Path $OU -Company $CSVs.Company[$Comp] -Department $CSVs.Department[$Dept] -Office $CSVs.Office[$Off] -City $CSVs.City[$C] -State $CSVs.State[$S] -PostalCode $CSVs.Zip[$Z] -Title $CSVs.Title[$T] -AccountExpirationDate $null -AccountPassword $Password1 -CannotChangePassword $False -ChangePasswordAtLogon $False -Enabled $True; $CSVs.SAM[$SAM]; $SAM; $FN++; $IN++; $LN++; $FN1++; $DN++; $EN++; $TN++; $SAM++; $U++; $Comp++; $Dept++; $Off++; $C++; $S++; $Z++; $T++ }

Start-Sleep 2

$ConC = 0
$Con = "No"
$SAM = 0

 "`n`n"

ForEach($CSV in $CSVs) { IF ($Contractor[$ConC] -Match $Con) { Add-ADGroupMember -Identity $Group1 -Members $CSVs.SAM[$SAM]; Add-ADGroupMember -Identity $Group2 -Members $CSVs.SAM[$SAM]; $SAM++ } ELSE { $SAM++ } ; $ConC++ }