简体   繁体   English

如何使用计算属性格式化 Out-GridView 显示?

[英]How to format the Out-GridView display using calculated property?

The Powershell script below works great to show the Azure User properties, except the license column which needs to be formatted to remove the company domain name.下面的 Powershell 脚本非常适合显示 Azure 用户属性,除了需要格式化以删除公司域名的许可证列。

This is the script.这是脚本。

#Import Module
If (!(Get-Module "*MSOnline*")) {Import-Module MSOnline}
If (!(Get-Module "*Exchange*")) {Import-Module $((Get-ChildItem -Path $($env:LOCALAPPDATA + "\Apps\2.0\") -Filter Microsoft.Exchange.Management.ExoPowershellModule.dll -Recurse).FullName | ?{ $_ -notmatch "_none_" } | select -First 1)}

#Set admin UPN
$UPN = 'Global.Admin@domain.com'

#This connects to Azure Active Directory & Exchange Online
Connect-MsolService
$EXOSession = New-ExoPSSession -UserPrincipalName $UPN
Import-PSSession $EXOSession -DisableNameChecking -AllowClobber

$startsWith = @(
    'Test'
    'Sync_'
)

$endsWith = @(
    '365'
    '\$'
    'svc'
    'Sync'
    'user'
)

$pattern = '^({0})|({1})$' -f $($startsWith -join '|'), $($endsWith -join '|')

# Member Outputs for Microsoft.Online.Administration.User based on https://docs.microsoft.com/en-us/powershell/module/msonline/get-msoluser?view=azureadps-1.0
$allUsers = @()
$allUsers = Get-MsolUser -All -EnabledFilter EnabledOnly | Where-Object {
        ($_.UserPrincipalName -notmatch $pattern) -and
        ($_.UserPrincipalName -notlike '*#EXT#*') -and
        ($_.DisplayName -notmatch 'Admin|Calendar|Room|Prod|Account|Fax|Team|Office|Test|User')
} | Select-Object FirstName, 
    LastName, 
    UserPrincipalName,
    @{Label = 'SMTP Address(es)'; 
        Expression = { 
            If (( $_.UserPrincipalName -match 'onmicrosoft.com$')) {
              ($_.proxyAddresses | Where-Object { ($_ -like 'SMTP*') -and ($_ -like '*onmicrosoft.com') }) -replace 'smtp:' -join ';'
            } Else {
                ($_.proxyAddresses | Where-Object { ($_ -like 'SMTP*') -and ($_ -notlike '*onmicrosoft.com') }) -replace 'smtp:' -join ';'
            }
        } 
    },
    AlternateEmailAddresses, 
    UsageLocation, 
    isLicensed,
    Licenses,
    @{Label = 'License(s)'; 
        Expression = {
            ($_.Licenses | ForEach-Object { ($_.AccountSkuId | Where-Object { $_.AccountSkuId -like 'CorpFinanceLtd*' }) -replace 'CorpFinanceLtd:' } ) -join ';'
        }
    },
    PasswordNeverExpires, 
    BlockCredential

$allUsers | Out-GridView

I believe this section needs some rework, but not sure how to do that?我相信这部分需要一些修改,但不知道该怎么做?

@{Label = 'License(s)'; 
    Expression = {
        ($_.Licenses | ForEach-Object { ($_.AccountSkuId | Where-Object { $_.AccountSkuId -like 'CorpFinanceLtd*' }) -replace 'CorpFinanceLtd:' } ) -join ';'
    }
},

The default Licenses column shows the license information like: {CorpFinanceLtd:MCOPSTNC, CorpFinanceLtd:ENTERPRISEPREMIUM, CorpFinanceLtd:EMSPREMIUM, CorpFinanceLtd:RIGHTSMANAGEMENT_ADHOC…}默认许可证列显示许可证信息,如: {CorpFinanceLtd:MCOPSTNC, CorpFinanceLtd:ENTERPRISEPREMIUM, CorpFinanceLtd:EMSPREMIUM, CorpFinanceLtd:RIGHTSMANAGEMENT_ADHOC…}

So how do I remove the CorpFinanceLtd: prefix part, so it makes a more meaningful result?那么如何删除 CorpFinanceLtd: 前缀部分,从而产生更有意义的结果?

You pass the value of $_.AccountSkuId as pipeline input, but keep looking for an AccountSkuId property on the resulting object(s) - which won't work, because it's just a string.您将$_.AccountSkuId作为管道输入传递,但继续在结果对象上寻找AccountSkuId属性 - 这不起作用,因为它只是一个字符串。

You can simplify the expression as follows:您可以将表达式简化如下:

@{
    Label = 'License(s)'; 
    Expression = {
        ($_.Licenses | ForEach-Object { $_.AccountSkuId  -replace '^CorpFinanceLtd:' } ) -join ';'
    }
},

The ^ in front of CorpFinanceLtd: ensure the regex engine will only match at the start of the string, no need for the wildcard filter anymore CorpFinanceLtd:前面的^ :确保正则表达式引擎只匹配字符串的开头,不再需要通配符过滤器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM