【问题标题】:How can I display format-table powershell data imported from csv with an if statement?如何使用 if 语句显示从 csv 导入的格式表 powershell 数据?
【发布时间】:2014-05-10 08:03:09
【问题描述】:

我正在尝试自动执行一些 Office 365 用户创建工作,但遇到了用于显示将要更改的值的简单格式语法。这段代码搜索 Azure 目录中 Usage Location 字段为空值的任何用户,并将它们存储到一个文件中(以后会多次使用,我也想将它保存在一个文件中以用于存档目的) )... 我想向运行脚本的用户显示的只是一个简单的表,其中包含名字、姓氏和 UPN...(不是 sam,需要 UPN 才能看到子域值)。但只有在 UPN 包含“@STU.DOMAIN.COM”时才会处理结果......这就是我现在所拥有的:

    Get-MsolUser -MaxResults 4000 | Where {$_.usagelocation -eq $null}| Export-Csv C:\Test.csv
    Import-CSV C:\Test.csv | ForEach-Object {
           $fname= $_.FirstName
           $lname= $_.LastName
           $UPN= $_.UserPrincipalName
           if ($UPN.Contains("@STU.DOMAIN.COM")) {
                New-Object -Typename PSObject -Property @{
                "User Principal Name" = $UPN
                "Last Name" = $lname
                "First Name" = $fname
                }
           } 
    }  

我不知道为什么,但是当我在 ISE 窗口中运行一小部分代码时它可以工作,但是当我连接到 MSOL 和脚本的其余部分时,它在正常的 powershell 窗口中不起作用正在玩……?我想我正在寻找具有实际经验的人来向我展示格式化此任务的正确方法......请有一些智慧可以分享吗?

谢谢!


更新: 嗨,Frode - 这似乎并没有将它们分成几组。 “用户主体名称”变量是他们的整个用户名@UPN,因此它不会按域和子域对其进行分组。输出如下所示:

       User Principal Name: User1@DOMAIN.COM

    First Name Last Name User Principal Name
    ---------- --------- -------------------
    User1      Last1     User1@DOMAIN.COM   


       User Principal Name: User2@STU.DOMAIN.COM

    First Name Last Name User Principal Name
    ---------- --------- -------------------
    User2      Last2     User2@STU.DOMAIN.COM

如何仅获取要排序的变量的 @STU.DOMAIN.COM 或 @DOMAIN.COM?

更新 2:
我设法找到一种方法来去除 UPN 的后缀并显示它,但它仍然很古怪。它随机列出了不同 UPN 的用户群...这是我从 Frode 修改的代码:

    $users |
    Select-Object @{n="First Name";e={$_.FirstName}}, @{n="Last Name";e={$_.LastName}}, @{n="Domain/UPN";e={$_.UserPrincipalName.split("@")[1]}} |
    Format-Table -AutoSize -GroupBy "Domain/UPN" | Out-String | Write-Host

但是输出有点奇怪……看起来像这样:

       Domain/UPN: STU.DOMAIN.COM

    First Name Last Name Domain/UPN    
    ---------- --------- ----------    
    Dede       Lastname  STU.DOMAIN.COM


       Domain/UPN: DOMAIN.COM

    First Name Last Name    Domain/UPN
    ---------- ---------    ----------
    Thomas     Lastname     DOMAIN.COM
    Wells      Lastname     DOMAIN.COM
    Amy        Lastname     DOMAIN.COM
    Tiffany    Lastname     DOMAIN.COM
    Sara       Lastname     DOMAIN.COM
    Amy        Lastname     DOMAIN.COM


       Domain/UPN: STU.DOMAIN.COM

    First Name Last Name Domain/UPN    
    ---------- --------- ----------    
    Jair       Lastname  STU.DOMAIN.COM


       Domain/UPN: DOMAIN.COM

    First Name Last Name      Domain/UPN
    ---------- ---------      ----------
    Cathy      Lastname       DOMAIN.COM
    Paul       Lastname       DOMAIN.COM
    Ridgewood  Lastname       DOMAIN.COM
    Patty      Lastname       DOMAIN.COM
    Linda      Lastname       DOMAIN.COM
    Chris      Lastname       DOMAIN.COM
    Cami       Lastname       DOMAIN.COM
    Kent       Lastname       DOMAIN.COM
    Michael    Lastname       DOMAIN.COM
    Stephanie  Lastname       DOMAIN.COM
    Amie       Lastname       DOMAIN.COM
    Patrick    Lastname       DOMAIN.COM
    LaVonne    Lastname       DOMAIN.COM
    De         Lastname       DOMAIN.COM
    Joann      Lastname       DOMAIN.COM
    Chuck      Lastname       DOMAIN.COM
    Kathy      Lastname       DOMAIN.COM
    Sue        Lastname       DOMAIN.COM
    Tech       Lastname       DOMAIN.COM
    Theresa    Lastname       DOMAIN.COM
    Kristin    Lastname       DOMAIN.COM
    Toni       Lastname       DOMAIN.COM
    Sabrina    Lastname       DOMAIN.COM

有没有一种方法可以解析它们并按域/UPN 后缀将它们组合在一起?

再次提前感谢!

【问题讨论】:

    标签: powershell csv azure format office365


    【解决方案1】:

    首先,我建议尝试这种方法,它删除了 if 测试、重新导入数据等。

    #Store result
    $users = Get-MsolUser -MaxResults 4000 | Where-Object {$_.usagelocation -eq $null}
    #Export to csv for later use
    $users | Export-Csv C:\Test.csv
    
    #Display users with UPN
    $users |
    Where-Object { $_.UserPrincipalName -match '@STU\.DOMAIN\.COM' } |
    Select-Object @{n="First Name";e={$_.FirstName}}, @{n="Last Name";e={$_.LastName}}, @{n="User Principal Name";e={$_.UserPrincipalName}} | Format-Table -AutoSize | Out-String | Write-Host
    

    要按 UPN 分组,请尝试:

    $users |
    Select-Object @{n="First Name";e={$_.FirstName}}, @{n="Last Name";e={$_.LastName}}, @{n="Domain/UPN";e={$_.UserPrincipalName.split("@")[1]}} |
    Sort-Object "Domain/UPN" |
    Format-Table -AutoSize -GroupBy "Domain/UPN" | Out-String | Write-Host
    

    【讨论】:

    • 感谢您的帮助 - 当运行这个 sn-p 的代码时,它就像一个冠军......但是,当我把它放在包含其余代码的脚本中时,它仍然不显示屏幕上的任何东西。如果我输入一个像 $UPN 这样的简单值,它会正常显示,它似乎由于某种原因不会在表格中显示格式......有什么原因吗?
    • 是的,CSV 有数据 - 工作正常 - 屏幕上没有显示任何内容。 UPN 匹配正确。
    • 尝试更新的答案。我需要查看脚本的其余部分才能找到问题。我认为错误的是,您的脚本的其余部分捕获了 select-object 返回的对象。因此,更新后的答案将其传递给Write-Host,以确保显示对象。
    • 只是好奇 - 有没有办法按 UPN 分组?所以也许我可以运行这个相同的脚本,而不是只显示 stu.domain.com UPN,它会显示 domain.com 用户以及 stu.domain.com 用户,但将它们分成组?
    • 我去掉了后缀,现在可以使用了——但似乎在解析列表时将用户聚集到不同的组中......有没有办法解析整个列表并在一个中显示所有用户先显示域,然后显示另一个子域?原始帖子中提供的示例。
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2021-09-22
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多