有没有办法在通过powershell运行quser命令时删除字段

时间:2016-06-02 15:08:30

标签: powershell powershell-v2.0 powershell-v3.0

我从我的一个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字段。我想将这些内容附加到电子邮件正文中。所以希望它缩短。

案例2:

多行输出如下所示:

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
    }
    $1=$current[$i++]
    $2=$current[$i++]
    $3=$current[$i++]
    $4=$current[$i++]
    $5=$current[$i++]
    $6=$current[$i++]
    $7=$current[$i++]


write-host $1
write-host $2
write-host $3
write-host $4
write-host $5
write-host $6
write-host $7

}

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

2 个答案:

答案 0 :(得分:2)

试试这个

$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

答案 1 :(得分:1)

你可以自己解析它。您必须跳过第一个条目,对其进行迭代并使用\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
    } 
}