powershell - 动态将项目添加到集合数组中

标签 powershell multidimensional-array

好的。这就是我想要做的。我基本上是试图通过从AD和SQL数据库导入内容来在Powershell中创建2D数组。我将在稍后的脚本中使用数组写入,更新和删除数据库中的行。我遇到的问题是将所有内容都放入一个变量中。

当我运行代码时,它将一遍又一遍地将同一用户添加到所需的数组中。 $ Table变量中创建的最后一项将覆盖$ ToWrite中的每个实例。

在将所有变量输入$ Table之后,将$ Table写入控制台,然后将$ ToWrite写入控制台后,我尝试暂停。 $ Table在每个循环中均正确更改,但是再次写入$ ToWrite后,它将覆盖每个实例。我已经尝试了多种方式,例如.add(),PsCustomObject []等。

这是我的半功能代码:

$AllPOCs = Get-ADGroupMember 'ALL POC'
$POCs = @()

$Counter = 0

$AllPOCs | ForEach-Object {
    $Name = $AllPOCs[$Counter].SamAccountName

    $TestPOC = Invoke-Sqlcmd -Query "SELECT * FROM TABLE WHERE CLIENT = '$Name'" -ServerInstance "SERVER\INSTANCE"

    if ($TestPOC -eq $null) {
        $POCs += Get-ADUser $Name -Properties * |
                 select -Property SamAccountName, GivenName, Surname, SID, EmailAddress
    }
    $Counter += 1
}

$ToWrite = @()
$Counter = 0
$SEQUENCE = Invoke-Sqlcmd -Query "Select TABLEFIELD FROM DATABASE WHERE NAME = 'FIELDID'" -ServerInstance "SERVER\INSTANCE"
$SEQUENCE = $SEQUENCE.RECNUM + 1
$Table = "" | select SEQUENCE, LASTUSER, GROUP, CLIENT, FNAME, NAME, EMAILID, USEDEPT, USELOCATION, CREATEDFROMSSD, DISPLAYCLIENTCOMMENTS, _INACTIVE_, WINUSERID, SELFSERVICEACCESS, SELFSERVICELICENSE, WIAENABLED, SID

#everything works correctly up to here

$POCs | ForEach-Object {
    $Table.SEQUENCE = $SEQUENCE
    $Table.LASTUSER = 'SYSTEMACCOUNT'
    $Table.GROUP = 1
    $Table.CLIENT = $POCs[$Counter].SamAccountName.ToUpper()
    $Table.FNAME = $POCs[$Counter].GivenName.ToString()
    $Table.Name = $POCs[$Counter].surname.ToString()
    $Table.EmailID = 'SMTP:{' + $POCs[$Counter].EmailAddress.ToString() + '}' + 
    $POCs[$Counter].EmailAddress.ToString()
    $Table.USEDEPT = 0
    $Table.USELOCATION = 0
    $Table.CREATEDFROMSSD = 0
    $Table.DISPLAYCLIENTCOMMENTS = 0
    $Table._INACTIVE_ = 0
    $Table.WINUSERID = '\DOMAIN' + $POCs[$Counter].SamAccountName.ToString()
    $Table.SELFSERVICEACCESS = 'TYPE'
    $Table.SELFSERVICELICENSE = 1
    $Table.WIAENABLED = 1
    $Table.SID = $POCs[$Counter].SID.ToString()

    $ToWrite += $Table #THIS DOESN'T WORK PROPERLY.
    $SEQUENCE += 1
    $Counter += 1
}

输出示例:

序列:1206
上一个用户:SYSTEMACCOUNT
组:1
客户:USERNAME
FNAME:FIRSTNAME
姓名:姓氏
EMAILID:SMTP:{EMAIL}电子邮件
USED​​EPT:0
使用率:0
创建的照片:0
显示评论:0
_INACTIVE_:0
WINUSERID:DOMAIN \ USERNAME
自助服务:类型
自我许可:1
可以使用:1
SID:S-1-Z-XX-CCCCCCCCCCCC-YYYYYYYYY-VVVVVVVVVV-125121

序列:1206
上一个用户:SYSTEMACCOUNT
组:1
客户:USERNAME
FNAME:FIRSTNAME
姓名:姓氏
EMAILID:SMTP:{EMAIL}电子邮件
USED​​EPT:0
使用率:0
创建的照片:0
显示评论:0
_INACTIVE_:0
WINUSERID:DOMAIN \ USERNAME
自助服务:类型
自我许可:1
可以使用:1
SID:S-1-Z-XX-CCCCCCCCCCCC-YYYYYYYYY-VVVVVVVVVV-125121

序列:1206
上一个用户:SYSTEMACCOUNT
组:1
客户:USERNAME
FNAME:FIRSTNAME
姓名:姓氏
EMAILID:SMTP:{EMAIL}电子邮件
USED​​EPT:0
使用率:0
创建的照片:0
显示评论:0
_INACTIVE_:0
WINUSERID:DOMAIN \ USERNAME
自助服务:类型
自我许可:1
可以使用:1
SID:S-1-Z-XX-CCCCCCCCCCCC-YYYYYYYYY-VVVVVVVVVV-125121

有任何想法吗?

最佳答案

举例说明-这里有很多警告,我在家里,所以无法测试其中任何一个,但是它应该可以给您一个想法:

$AllPOCs = Get-ADGroupMember 'ALL POC'

$Table = $AllPOCs | ForEach-Object {
    $Name = $_.SamAccountName
    $TestPOC = Invoke-Sqlcmd -Query "SELECT * FROM TABLE WHERE CLIENT = '$Name'" -ServerInstance "SERVER\INSTANCE"

    If($TestPOC -eq $null) {
        $POC = get-aduser $Name -Properties * | select -Property SamAccountName, GivenName, Surname, SID, EmailAddress 
        $SEQUENCE = Invoke-Sqlcmd -Query "Select TABLEFIELD FROM DATABASE WHERE NAME = 'FIELDID'" -ServerInstance "SERVER\INSTANCE"
        $SEQUENCE = $SEQUENCE.RECNUM + 1
        [pscustomobject]@{SEQUENCE = $SEQUENCE;
                        LASTUSER = 'SYSTEMACCOUNT';
                        GROUP = 1;
                        CLIENT = $_.ToUpper();
                        FNAME = $_.GivenName.ToString();
                        Name = $_.surname.ToString();
                        EmailID = 'SMTP:{' + $_.EmailAddress.ToString() + '}' + $_.EmailAddress.ToString();
                        USEDEPT = 0;
                        USELOCATION = 0;
                        CREATEDFROMSSD = 0;
                        DISPLAYCLIENTCOMMENTS = 0;
                        _INACTIVE_ = 0;
                        WINUSERID = '\DOMAIN' + $_.SamAccountName.ToString();
                        SELFSERVICEACCESS = 'TYPE';
                        SELFSERVICELICENSE = 1;
                        WIAENABLED = 1;
                        SID = $_.SID.ToString()}
        $SEQUENCE += 1
    }
}

上面的内容也可以简化,但我尝试使其与您的exisitng代码相似

关于powershell - 动态将项目添加到集合数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58241031/

相关文章:

powershell - bash 上相当于 `which` 的 cmd/powershell 是什么?

c# - PowerShell 在 NavigateComplete2 事件触发时崩溃

C++矩阵乘法返回数组第一行和最后两行的指针

java - java中二维矩阵乘法的问题

powershell - Powershell txt文件过滤

powershell - 如何在 wsl2 上使用 linux dd 命令来刻录可启动的 USB?

loops - 为什么我不能将哈希表存储在数组列表中?

java - 计算二维数组中出现的元素数量

python - Pandas 放大多维物体

使用 C 中的二维数组和函数创建井字游戏程序