将包含多个数组的 Powershell 对象导出到 CSV/Power BI

Exporting a Powershell object containing multiple arrays to CSV/Power BI

今天是星期五,我的大脑不工作了!我有一个 Powershell 对象,它是我想用作 Power BI 数据集的 DSInternals Test-PasswordQuality cmdlet 的结果;它是一堆用户帐户数组,例如

ClearTextPassword          : {}
LMHash                     : {someuser, another user...}
EmptyPassword              : {someuser, another user}
WeakPassword               : {someuser, another user...}
DefaultComputerPassword    : {etc...}
PasswordNotRequired        : {etc...}
PasswordNeverExpires       : {etc...}
AESKeysMissing             : {etc...}
PreAuthNotRequired         : {}
DESEncryptionOnly          : {}
Kerberoastable             : {}
DelegatableAdmins          : {}
SmartCardUsersWithPassword : {}
DuplicatePasswordGroups    : {}

我想将其导出到一个 csv,其中每个数组都是它自己的列。如果我只是做

$result | export-csv .\result.csv -NoTypeInformation

我确实为每个数组得到一列,但随后每一列中的用户都合并到一个单元格中。

example of first few columns

我怎样才能得到相同的,但每个用户都在自己的单元格中?

或者,如何使用 MicrosoftPowerBIMgmt 模块将此 PS 对象直接放入 Power BI 数据集中?

谢谢大家!

此答案中的对象是您的最小表示,旨在演示您可以使用的方法。

首先需要计算出所有属性的最大元素个数,为此,我们可以访问PSObject.Properties and for each value, get it's count. Then, we can use a for loop进行重构。

$object = [pscustomobject]@{
    ClearTextPassword       = @()
    EmptyPassword           = @('someuser', 'another user', 'yet another')
    WeakPassword            = @('someuser', 'another user')
    DefaultComputerPassword = @('etc')
    PasswordNotRequired     = @(1,2,3,4,5)
}

$max = [System.Linq.Enumerable]::Max($object.PSObject.Properties.ForEach({ $_.Value.Count }))

$result = for($i = 0; $i -lt $max; $i++) {
    $outObject = [ordered]@{}
    foreach($prop in $object.PSObject.Properties) {
        $outObject[$prop.Name] = $prop.Value[$i]
    }
    [pscustomobject]$outObject
}

$result | Format-Table

上面的示例将导致以下结果 object[],这对于导出到 CSV 应该是完美的。

ClearTextPassword EmptyPassword WeakPassword DefaultComputerPassword PasswordNotRequired
----------------- ------------- ------------ ----------------------- -------------------
                  someuser      someuser     etc                                       1
                  another user  another user                                           2
                  yet another                                                          3
                                                                                       4
                                                                                       5