【问题标题】:Office 365 Powershell - Formatting the output of a foreach-object loopOffice 365 Powershell - 格式化 foreach-object 循环的输出
【发布时间】:2021-01-10 06:23:33
【问题描述】:

大家晚上好,

对于 Powershell 来说还是很新的东西,但我一直在尝试将一些脚本组合在一起,以使我们需要从客户的 Office 365 租户中提取的许多信息更容易生成一些报告。

脚本已经完成了我需要的工作(从租户那里获取订阅,从我的 CSV 获取订阅的友好名称,然后写入控制台),但是我的问题是关于格式:我想在表格中格式化此输出,列标题为 Subscriptions、Active、Suspended、Assigned。

$sku = Get-MsolAccountSku | select-object skupartnumber,ActiveUnits,suspendedUnits,ConsumedUnits | sort-object -property skupartnumber
$skudata = import-csv -Header friendlyname,skupartnumber "C:\PShell\SKUs.csv" | where-object {$sku.skupartnumber -eq $_.skupartnumber} | sort-object -property skupartnumber

$skudata | foreach-object {$n = 0}{write-host $skudata.friendlyname[$n], $sku.ActiveUnits[$n], $sku.SuspendedUnits[$n], $sku.ConsumedUnits[$n]; $n = $n + 1}

## Output:

POWER BI (FREE) 1000000 0 1
MICROSOFT TEAMS EXPLORATORY 100 0 6

这是脚本和输出,我现在正在使用 write-host,因为这会以我们想要的相同方式格式化数据,我可以轻松地将其从控制台复制到我们的票证中。但是,当我使用 write-output 时,它会将每个单元格放在自己的行中,我似乎无法弄清楚如何将其输入到 format-table 中。

$skudata | foreach-object {$n = 0}{write-output $skudata.friendlyname[$n], $sku.ActiveUnits[$n], $sku.SuspendedUnits[$n], $sku.ConsumedUnits[$n]; $n = $n + 1}

# Output:
POWER BI (FREE)
1000000
0
1
MICROSOFT TEAMS EXPLORATORY
100
0
6

我已经能够使用下面的哈希表和简单的脚本获得我需要的一切,唯一的问题是它无法提取通用订阅名称,而微软的 skupartnumber 标识符是最好的选择,但并不总是非常描述性的。我敢肯定,我只是缺少一些非常简单的解决方案,但是如果有人能指出我尝试过的任何一种解决方案的正确方向,我将不胜感激!

$subs = @{Label="Subscription"; Expression={$_.skupartnumber}; Alignment = "right";}
$active = @{Label="Active"; Expression={$_.ActiveUnits}; Alignment = "right"}
$assigned = @{Label="Assigned"; Expression={$_.ConsumedUnits}; Alignment = "right"}
$suspended = @{Label="Suspended"; Expression={$_.SuspendedUnits}; Alignment = "right"}

Get-MsolAccountSku | Format-Table $subs, $active, $suspended, $assigned -autosize

# Output:
     Subscription  Active Suspended Assigned
     ------------  ------ --------- --------
POWER_BI_STANDARD 1000000         0        1
TEAMS_EXPLORATORY     100         0        6

【问题讨论】:

    标签: powershell office365


    【解决方案1】:

    PowerShell 是一种面向对象的语言,您需要在对象中收集所需的信息以进行进一步处理或输出。

    试试

    $result = for ($n = 0; $n -lt $skudata.Count; $n++) {
        # output the data as PSObject that gets collected in variable $result
        [PsCustomObject]@{
            Subscription = $skudata.friendlyname[$n]
            Active       = $sku.ActiveUnits[$n]
            Suspended    = $sku.SuspendedUnits[$n]
            Assigned     = $sku.ConsumedUnits[$n]
        }
    }
    
    # output on screen
    $result | Format-Table -AutoSize
    
    # output to CSV
    $result | Export-Csv -Path "C:\PShell\SkuUsage.csv" -NoTypeInformation
    

    【讨论】:

    • 欣赏洞察力,这完全符合我的需要,并为我提供了一些关于如何使我的其他脚本更好的想法;谢谢!
    • 我一直在使用这些脚本取得了巨大的成功,但是我注意到当客户端只有一个订阅时,您描述的 for 循环似乎不起作用。数据被正确读入 $sku 和 $skudata 但是当只有一行数据时 $result 最终为空(当有两个或更多订阅/行数据时,我根本没有看到任何问题)。
    • @phoneybaloneypshell 您可以将$skudata.Count 更改为@($skudata).Count。即使只有一个元素,这也会强制 $skudata 成为一个数组。
    • 感谢您的回复,这确实填充了 $result 并正确输出了表格,但订阅列仅显示友好名称的第一个字符。对于具有多个订阅的帐户,输出仍然正确。
    • 知道 powershell 将单个元素数组转换为字符串使得这种行为更容易理解,感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 2020-04-27
    • 2022-07-20
    • 2020-03-03
    • 2016-07-11
    • 2020-02-22
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多