使用 Powershell 输入 validation/data 过滤
Input validation/data filtering with Powershell
我已经为此工作了一段时间,基本上我所做的就是从我们客户的 Office 365 租户那里获取许可并以更易读的方式显示它,因为 Office 365 Powershell 不输出公共名称中的订阅名称。当每个订阅都在我的订阅名称的 CSV 中时,这非常有效,但是在 SKU 不在我的列表(全新或旧产品)中的情况下,许可 table 无法正确填充,因为它找不到我的 CSV 中的友好名称(许可数量与订阅名称不匹配,因为找不到 SKU 时出现空白记录)。
我想让它做的是在订阅不在我的 CSV 中而不是破坏输出的情况下显示 skupartnumber 代替友好名称。下面的第一个片段是我当前的工作脚本,只有当 SKU 在我的 CSV 中时它才有效,下面的片段是我尝试输入验证的最佳尝试,但我就是无法让它工作。除了空白的订阅列外,所有内容都正确显示(我还注意到 运行 花费的时间大约是正常情况下的 5 倍),我将不胜感激提供的任何帮助;谢谢!
只要订阅在我的 CSV 中就有效:
$sku = Get-MsolAccountSku | select-object skupartnumber,ActiveUnits,suspendedUnits,ConsumedUnits | sort-object -property skupartnumber
$skudata = import-csv -Header friendlyname,skupartnumber "C:\PShell\cspcatalogalphabet.csv" | where-object {$sku.skupartnumber -eq $_.skupartnumber} | sort-object -property skupartnumber
$result = for ($n = 0; $n -lt @($skudata).Count; $n++) {
[PsCustomObject]@{
Subscription = @($skudata.friendlyname)[$n]
Active = $sku.ActiveUnits[$n]
Suspended = $sku.SuspendedUnits[$n]
Assigned = $sku.ConsumedUnits[$n]
}
}
$result | Format-Table -AutoSize
# Output:
Subscription Active Suspended Assigned
------------ ------ --------- --------
Microsoft Flow Free 10000 0 1
Power Bi (Free) 1000000 0 1
Microsoft Teams Exploratory 100 0 6
我在输入验证方面的最佳尝试导致没有数据被读入 $skulist.Subscription:
$sku = Get-MsolAccountSku | select-object skupartnumber,ActiveUnits,suspendedUnits,ConsumedUnits
$skulist = import-csv -Header friendlyname,skupartnumber "C:\PShell\cspcatalogalphabet.csv"
$skuname = for ($c = 0; $c -lt @($sku).count; $c++) {
if ($sku.skupartnumber[$c] -in $skulist.skupartnumber) {
[PsCustomObject]@{
Subscription = $skulist.friendlyname | where-object {$sku.skupartnumber[$c] -eq $skulist.skupartnumber}
}
}
else {
[PSCustomObject]@{
Subscription = @($sku.skupartnumber)[$c]
}
}
}
$table = for ($n = 0; $n -lt @($sku).Count; $n++) {
[PsCustomObject]@{
Subscription = @($skuname.Subscription)[$n]
Active = $sku.ActiveUnits[$n]
Suspended = $sku.SuspendedUnits[$n]
Assigned = $sku.ConsumedUnits[$n]
}
}
$table | format-table -AutoSize
# Output:
Subscription Active Suspended Assigned
------------ ------ --------- --------
10000 0 1
1000000 0 1
100 0 6
# An example of data I am grabbing from our clients' accounts:
$sku = Get-MsolAccountSku | select-object skupartnumber,ActiveUnits,suspendedUnits,ConsumedUnits
$sku
# Output:
SkuPartNumber ActiveUnits SuspendedUnits ConsumedUnits
------------- ----------- -------------- -------------
FLOW_FREE 10000 0 1
POWER_BI_STANDARD 1000000 0 1
TEAMS_EXPLORATORY 100 0 6
而不是依赖于对齐的两个数组——也就是说,索引$n
in $sku
必须 对应于 $skulist
中索引 $n
处的项目,以便您的代码正常工作 - 您将希望能够根据 实际解析 $skulist
中的值 $SKU.SkuPartNumber
值。
那么怎么做呢?!
改为将 $skulist
喂入 [hashtable]
:
$skulist = @{}
Import-Csv -Header friendlyname,skupartnumber "C:\PShell\cspcatalogalphabet.csv" |ForEach-Object {
$skulist[$_.skupartnumber] = $_.friendlyname
}
然后像这样遍历 $skudata
(注意不再需要 for(;;)
循环,我们不需要关心数组对齐!):
foreach($skuEntry in $sku){
[pscustomobject]@{
Subscription = if($skuList.ContainsKey($skuEntry.SKUPartNumber){$skuList[$skuEntry.SKUPartNumber]}else{$skuEntry.SKUPartNumber})
Active = $skuEntry.ActiveUnits
Suspended = $skuEntry.SuspendedUnits
Assigned = $skuEntry.ConsumedUnits
}
}
我已经为此工作了一段时间,基本上我所做的就是从我们客户的 Office 365 租户那里获取许可并以更易读的方式显示它,因为 Office 365 Powershell 不输出公共名称中的订阅名称。当每个订阅都在我的订阅名称的 CSV 中时,这非常有效,但是在 SKU 不在我的列表(全新或旧产品)中的情况下,许可 table 无法正确填充,因为它找不到我的 CSV 中的友好名称(许可数量与订阅名称不匹配,因为找不到 SKU 时出现空白记录)。
我想让它做的是在订阅不在我的 CSV 中而不是破坏输出的情况下显示 skupartnumber 代替友好名称。下面的第一个片段是我当前的工作脚本,只有当 SKU 在我的 CSV 中时它才有效,下面的片段是我尝试输入验证的最佳尝试,但我就是无法让它工作。除了空白的订阅列外,所有内容都正确显示(我还注意到 运行 花费的时间大约是正常情况下的 5 倍),我将不胜感激提供的任何帮助;谢谢!
只要订阅在我的 CSV 中就有效:
$sku = Get-MsolAccountSku | select-object skupartnumber,ActiveUnits,suspendedUnits,ConsumedUnits | sort-object -property skupartnumber
$skudata = import-csv -Header friendlyname,skupartnumber "C:\PShell\cspcatalogalphabet.csv" | where-object {$sku.skupartnumber -eq $_.skupartnumber} | sort-object -property skupartnumber
$result = for ($n = 0; $n -lt @($skudata).Count; $n++) {
[PsCustomObject]@{
Subscription = @($skudata.friendlyname)[$n]
Active = $sku.ActiveUnits[$n]
Suspended = $sku.SuspendedUnits[$n]
Assigned = $sku.ConsumedUnits[$n]
}
}
$result | Format-Table -AutoSize
# Output:
Subscription Active Suspended Assigned
------------ ------ --------- --------
Microsoft Flow Free 10000 0 1
Power Bi (Free) 1000000 0 1
Microsoft Teams Exploratory 100 0 6
我在输入验证方面的最佳尝试导致没有数据被读入 $skulist.Subscription:
$sku = Get-MsolAccountSku | select-object skupartnumber,ActiveUnits,suspendedUnits,ConsumedUnits
$skulist = import-csv -Header friendlyname,skupartnumber "C:\PShell\cspcatalogalphabet.csv"
$skuname = for ($c = 0; $c -lt @($sku).count; $c++) {
if ($sku.skupartnumber[$c] -in $skulist.skupartnumber) {
[PsCustomObject]@{
Subscription = $skulist.friendlyname | where-object {$sku.skupartnumber[$c] -eq $skulist.skupartnumber}
}
}
else {
[PSCustomObject]@{
Subscription = @($sku.skupartnumber)[$c]
}
}
}
$table = for ($n = 0; $n -lt @($sku).Count; $n++) {
[PsCustomObject]@{
Subscription = @($skuname.Subscription)[$n]
Active = $sku.ActiveUnits[$n]
Suspended = $sku.SuspendedUnits[$n]
Assigned = $sku.ConsumedUnits[$n]
}
}
$table | format-table -AutoSize
# Output:
Subscription Active Suspended Assigned
------------ ------ --------- --------
10000 0 1
1000000 0 1
100 0 6
# An example of data I am grabbing from our clients' accounts:
$sku = Get-MsolAccountSku | select-object skupartnumber,ActiveUnits,suspendedUnits,ConsumedUnits
$sku
# Output:
SkuPartNumber ActiveUnits SuspendedUnits ConsumedUnits
------------- ----------- -------------- -------------
FLOW_FREE 10000 0 1
POWER_BI_STANDARD 1000000 0 1
TEAMS_EXPLORATORY 100 0 6
而不是依赖于对齐的两个数组——也就是说,索引$n
in $sku
必须 对应于 $skulist
中索引 $n
处的项目,以便您的代码正常工作 - 您将希望能够根据 实际解析 $skulist
中的值 $SKU.SkuPartNumber
值。
那么怎么做呢?!
改为将 $skulist
喂入 [hashtable]
:
$skulist = @{}
Import-Csv -Header friendlyname,skupartnumber "C:\PShell\cspcatalogalphabet.csv" |ForEach-Object {
$skulist[$_.skupartnumber] = $_.friendlyname
}
然后像这样遍历 $skudata
(注意不再需要 for(;;)
循环,我们不需要关心数组对齐!):
foreach($skuEntry in $sku){
[pscustomobject]@{
Subscription = if($skuList.ContainsKey($skuEntry.SKUPartNumber){$skuList[$skuEntry.SKUPartNumber]}else{$skuEntry.SKUPartNumber})
Active = $skuEntry.ActiveUnits
Suspended = $skuEntry.SuspendedUnits
Assigned = $skuEntry.ConsumedUnits
}
}