【问题标题】:Trying to strip out unwanted text in PowerShell试图在 PowerShell 中去除不需要的文本
【发布时间】:2018-10-19 08:18:43
【问题描述】:

我正在制作一个 PowerShell 脚本,用于查询我们的 Office 365 租户并将某些信息导出到 .csv 文件中。我正在努力处理的两个字段是用户的默认电子邮件地址和他们分配的订阅。我可以获得数据,但不确定如何操作它并使其看起来更美观。

    Get-MSOLUser -All | select firstname,lastname,displayname,islicensed,{$_.Licenses.AccountSkuId},{$_.proxyaddresses -cmatch '^SMTP\:.*'},userprincipalname | sort FirstName | Export-Csv $directory\$tenantname\Export.csv -NoTypeInformation

1) 我已经设法获得了他们的主要电子邮件地址,因为小写的 smtp 地址将始终是别名,但是如何去掉“SMTP:”部分?

2) 我希望将其缩短为我们通常称其为的名称,而不是“经销商帐户:SKU 部件号”!如:

  • “E3”而不是“reseller-account:ENTERPRISEPACK”
  • “E5”而不是“reseller-account:ENTERPRISEPREMIUM”
  • “ProjectPro”而不是“reseller-account:PROJECTPROFESSIONAL”
  • “Visio”而不是“reseller-account:VISIOCLIENT”

两个问题确实但非常相似!希望你能帮忙。

【问题讨论】:

  • 如果您问两个不同的问题,我更愿意: 1. 给定字符串“smtp:foo@foo.com”,我如何去除“smtp:”? 2. 给定字符串替换值列表,我如何用它们更改目标字符串?请不要您的大部分上下文与问题无关,而仅与您有关。您可以找到更多此类建议here
  • 以1为例。"SMTP:yourString" -replace "SMTP:", ""

标签: powershell export-to-csv


【解决方案1】:

为了实现您可以使用 Calculated Properties 和一个小函数将 SkuId 转换为友好名称并使用 -replace 删除 SMTP 部分,我为您创建了一个简单的转换函数,您可以像我一样添加其他产品:

可以在此link 中找到 Microsoft 产品名称/SKU 的列表

function Convert-SkuIdToFriendlyName
{
Param(
[string]$SkuId
)
    switch ($SkuId)
    {
        {$SkuId -match "ENTERPRISEPACK"} {return "OFFICE 365 ENTERPRISE E3"}
        {$SkuId -match "ENTERPRISEPREMIUM"} {return "OFFICE 365 ENTERPRISE E5"}
        default { 'Unknown' }
    }
}

然后使用计算属性替换'SMTP'部分并转换SkuId:

Get-MSOLUser -All | 
Select firstname,lastname,displayname,islicensed,
@{N="License";E={Convert-SkuIdToFriendlyName $_.Licenses.AccountSkuId}},
@{N="Email";E={$_.proxyaddresses -cmatch '^SMTP\:.*' -replace 'SMTP\:'}},userprincipalname | 
Sort FirstName 

【讨论】:

  • 谢谢你,这简直是完美的。我可以在许可证方面要求一个小的调整(我已经尝试过但不能!)即使用户分配了多个,代码也只显示一个许可证。例如,一个人可能拥有“{reseller-account:MCOPSTN1, reseller-account:MCOEV, reseller-account:ENTERPRISEPACK}”,但只能通过脚本获得这些短 SkId 之一。我如何获得它,以便他们可以拥有“E3、国内通话计划、微软电话系统”等...
【解决方案2】:

您可以使用哈希表作为所需翻译的查找表,如下所示:

# create a hash with the desired translations.
# below are just the examples from your question. You need to fill in the rest..
$Licenses = @{
    "ENTERPRISEPACK" = "E3"
    "ENTERPRISEPREMIUM" = "E5"
    "PROJECTPROFESSIONAL" = "ProjectPro"
    "VISIOCLIENT" = "Visio"
}

Get-MSOLUser -All | 
    Select-Object firstname,lastname,displayname,islicensed,userprincipalname,
                  @{ Name = 'License'; Expression = { $Licenses[$(($_.Licenses.AccountSkuId) -replace '^.+:', '')] }},
                  @{ Name = 'PrimaryEmailAddress'; Expression = { ($_.proxyaddresses -cmatch '^SMTP\:.*') -replace "SMTP:", "" }} | 
    Sort-Object FirstName | Export-Csv $directory\$tenantname\Export.csv -NoTypeInformation

为了获得用户可以列出的所有许可证,代码可以扩展为:

# create a hash with the desired translations for the license plans.
# below are just the examples from your question. You need to fill in the rest..
$Licenses = @{
    "ENTERPRISEPACK" = "E3"
    "ENTERPRISEPREMIUM" = "E5"
    "PROJECTPROFESSIONAL" = "ProjectPro"
    "VISIOCLIENT" = "Visio"
}

# this calculated property returns all (translated) licenses per user as comma delimited string
$userLicenses = @{
    Name = 'Licenses'
    Expression = {
        $result = @()
        foreach($lic in $_.Licenses) {
            $result += $Licenses[$(($lic.AccountSkuId) -replace '^.+:', '')]
        }
        $result -join ', '
    }
}

Get-MSOLUser -All | 
    Select-Object firstname,lastname,displayname,islicensed,userprincipalname,$userLicenses,
                  @{ Name = 'PrimaryEmailAddress'; Expression = { ($_.proxyaddresses -cmatch '^SMTP\:.*') -replace "SMTP:", "" }} | 
    Sort-Object FirstName | Export-Csv $directory\$tenantname\Export.csv -NoTypeInformation

【讨论】:

  • @KDD 我已经编辑了我的答案,以在输出中以逗号分隔的字符串形式获取用户的所有许可证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2013-05-14
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多