Powershell 在 foreach 循环中处理单个数组与在 foreach 循环中处理多个数组

Powershell process single array in foreach loop versus multi aray in foreach loop

我有 3 个数组,每个数组有 3 个元素

当我 运行 它在 foreach 循环中时它工作正常并产生预期的结果

$OHSS_AU_Params = 'OU=ActiveUsers,OU=OHSS_Users,OU=OHSS,OU=HCCSS,DC=test,DC=ssh', '66-66-66-66', '66-OHSS'
   _ESC_AU_Params = 'OU=ActiveUsers,OU=Users,OU=01 Erie St. Clair,OU=CCAC,DC=test,DC=ssh', '01-01-01-01', '01-ESC'
   _SW_AU_Params = 'OU=ActiveUsers,OU=Users,OU=02 South West,OU=CCAC,DC=test,DC=ssh', '02-02-02-02', '02-SW'

   $All_OUs = $OHSS_AU_Params, _ESC_AU_Params, _SW_AU_Params

    foreach ($OU in $All_OUs)
    {
        write-host "`n Search -> " $OU[0]
        write-host " EmployeeID -> " $OU[1]
        write-host " LegacyName -> " $OU[2]
    
    }

输出

Search ->  OU=ActiveUsers,OU=OHSS_Users,OU=OHSS,OU=HCCSS,DC=test,DC=ssh
EmployeeID ->  66-66-66-66
LegacyName ->  66-OHSS

Search ->  OU=ActiveUsers,OU=Users,OU=01 Erie St. Clair,OU=CCAC,DC=test,DC=ssh
EmployeeID ->  01-01-01-01
LegacyName ->  01-ESC

Search ->  OU=ActiveUsers,OU=Users,OU=02 South West,OU=CCAC,DC=test,DC=ssh
EmployeeID ->  02-02-02-02
LegacyName ->  02-SW

但是当数组的个数变为只有一个时

$All_OUs = $OHSS_AU_Params

我明白了

Search ->  O
EmployeeID ->  U
LegacyName ->  =

Search ->  6
EmployeeID ->  6
LegacyName ->  -

Search ->  6
EmployeeID ->  6
LegacyName ->  -

我如何检查数组是否是包含 3 个元素的单个数组

我尝试修改 foreach 循环,如

foreach ($OU in $All_OUs)
{
   write-host "`n Search -> " @($OU)[0]
   write-host " EmployeeID -> " @($OU)[1]
   write-host " LegacyName -> " @($OU)[2]
}

但我仍然在循环中进行了 3 次迭代,而不是一次,但现在看起来更好了

Search ->  OU=ActiveUsers,OU=OHSS_Users,OU=OHSS,OU=HCCSS,DC=test,DC=ssh
EmployeeID ->
LegacyName ->

Search ->  66-66-66-66
EmployeeID ->
LegacyName ->

Search ->  66-OHSS
EmployeeID ->
LegacyName ->

但我需要的只是一次迭代,看起来像这样

Search ->  OU=ActiveUsers,OU=OHSS_Users,OU=OHSS,OU=HCCSS,DC=test,DC=ssh
EmployeeID -> 66-66-66-66
LegacyName -> 66-OHSS

抱歉我的英语不是最好的。

谢谢

PowerShell 这样做的原因是因为在您的第二个示例中,$All_OUs 是一个 数组,而在您的第一个示例中,$All_OUs 是一个 数组的数组.

您可以通过添加 Comma operator ,:

强制 $All_OUs 成为数组的 数组
$OHSS_AU_Params = 'OU=ActiveUsers,OU=OHSS_Users,OU=OHSS,OU=HCCSS,DC=test,DC=ssh', '66-66-66-66', '66-OHSS'
$All_OUs = , $OHSS_AU_Params

foreach ($OU in $All_OUs) {
    Write-Host "`n Search -> " $OU[0]
    Write-Host " EmployeeID -> " $OU[1]
    Write-Host " LegacyName -> " $OU[2]
}

但是,更可靠的方法是使用 hash table,这样您就无需验证 集合 是否为 arrayarray of arrays:

$toProcess = @{
    'OU=ActiveUsers,OU=OHSS_Users,OU=OHSS,OU=HCCSS,DC=test,DC=ssh' = '66-66-66-66', '66-OHSS'
    'OU=ActiveUsers,OU=Users,OU=01 Erie St. Clair,OU=CCAC,DC=test,DC=ssh' = '01-01-01-01', '01-ESC'
    'OU=ActiveUsers,OU=Users,OU=02 South West,OU=CCAC,DC=test,DC=ssh' = '02-02-02-02', '02-SW'
}

foreach ($key in $toProcess.PSBase.Keys) {
    # => `$values` is the array with EmployeeID and LegacyName for each `$key` (OU)
    $values = $toProcess[$key]
    Write-Host "`n Search -> " $key
    Write-Host " EmployeeID -> " $values[0]
    Write-Host " LegacyName -> " $values[1]
}