有什么方法可以通过 powershell 在 运行 quser 命令中删除字段

Is there any way to get rid of fields while running quser command via powershell

我是 运行 来自我的一个 powershell 脚本的 quser 命令,它显示

PS C:\Users\Arun> quser

USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
Arun         console             1  Active    1+01:58  01/06/2016 14:01

有什么方法可以限制 quser 显示中的 no.of 字段 command.I 想将此内容附加到电子邮件中 ​​body.So 想缩短它。

案例二:

多行输出如下所示:


USERNAME     SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
Arun         console             1  Active    1+01:58  01/06/2016 14:01
ABC                              1  DISC      1+01:58  01/06/2016 14:01
DEF                              1  Active    1+01:58  01/06/2016 14:01
GHI         console              1  DISC      1+01:58  01/06/2016 14:01
IJK                              1  DISC      1+01:58  01/06/2016 14:01

尝试了其中一个解决方案中提供的修改后的代码。 但是,当 sessionname 为空值时,数据会向左移动。

USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
 abc12367                                  2  Disc         2:08  5/20/2016 4:55 PM
 def12367                                  3  Disc      4+03:55  6/9/2016 11:13 AM
>ghi12367               rdp-tcp#3          4  Active          .  6/13/2016 10:00 AM
 jkl12367                                  5  Disc           10  6/10/2016 3:54 PM
 abc12367                                  7  Disc      2+23:56  5/19/2016 12:15 PM
 mno12367                                  8  Disc      3+22:07  6/9/2016 4:52 PM
 pqr12367              rdp-tcp#1           9  Active         12  6/9/2016 7:55 PM
 stu12367              rdp-tcp#2           10  Active          .  6/13/2016 10:35 AM
 vwx12367                                  11  Disc         4:21  6/13/2016 10:38 AM

用于连续打印变量值的代码:

quser | select -Skip 1 | ForEach-Object { 
    $current = $_ -split '\s+'
    $i = 0;
    $username = $current[$i++].Trim('>')
    if ($current.Length -eq 7) 
    {
        $sessionname = $current[$i++] 
    }
    else
    {
        $sessionname = $null
    }
    =$current[$i++]
    =$current[$i++]
    =$current[$i++]
    =$current[$i++]
    =$current[$i++]
    =$current[$i++]
    =$current[$i++]


write-host 
write-host 
write-host 
write-host 
write-host 
write-host 
write-host 

}

你能帮我解决这个问题吗?

你可以自己解析。您必须跳过第一个条目,遍历它并使用 \s+ 拆分字符串。现在您可以使用数组索引访问您想要的数据,这里是前两列的示例:

quser | select -Skip 1 | ForEach-Object { 
    $current = $_ -split '\s+'
    $username = $current[0].Trim('>')
    $sessionname = $current[1]
}

回复您的评论:

quser | select -Skip 1 | ForEach-Object { 
    $current = $_.Trim() -split '\s{2,}'
    $i = 0;
    $username = $current[$i++].Trim('>')
    if ($current.Length -eq 6) # entry containing session name
    {
        $sessionname = $current[$i++]    
    }
    else
    {
        $sessionname = $null
    }

    $id = $current[$i++]
    $state = $current[$i++]
    $idleTime = $current[$i++]
    $LogonTime = $current[$i++]

    return [PSCustomObject]@{
        Username = $username
        Sessionname = $sessionname
        Id = $id
        State = $state
        IdleTime = $idleTime
        LogonTime = $LogonTime
    } 
} 

试试这个

$quser = (quser) -replace '\s{2,}', ',' | ConvertFrom-Csv

$quser | select username, 'logon time'

# yields:
# USERNAME          LOGON TIME
# --------          ----------
# >anthony.stringer 6/2/2016 7:36 AM

或转换为html

$quser | select username, 'logon time' | ConvertTo-Html | Set-Content C:\temp\test.html

start C:\temp\test.html