2016-06-02 9 views
1

ich von einem meiner Powershell-Skript den quser Befehl leite und zeigtGibt es eine Möglichkeit loswerden Felder zu bekommen, während quser Befehl über Powershell ausgeführt wird

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 

Gibt es eine Möglichkeit, die no.of Felder in der Anzeige des Befehls quser einzuschränken.Ich wollte diesen Inhalt in einem E-Mail-Körper anhängen.So wollte es kurz.

Fall 2:

Output mit mehreren Reihen sieht aus wie folgt:


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 

versucht, die modifizierte Code in eine der Lösungen zur Verfügung gestellt. Aber die Daten werden nach links verschoben, wenn ein leerer Wert für den Sitzungsnamen vorhanden ist.

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 

Code verwendet, um die Variablenwerte drucken kontinuierlich:

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 

} 

Könnten Sie mir bitte helfen, das Problem bei der Lösung?

Antwort

1

Sie könnten es selbst analysieren. Sie müssen den ersten Eintrag überspringen, darüber iterieren und die Zeichenfolge unter Verwendung von \s+ teilen. Jetzt können Sie die gewünschten Daten zugreifen ein Array-Index verwendet wird, hier ein Beispiel für die ersten zwei Spalten:

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

Antwort auf Ihren Kommentar:

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 
    } 
} 
+0

Das hat mir sehr geholfen. Eine kleine Abfrage, wenn ich dies auf meinem Server, gibt es einige Zeilen, die das zweite Feld als leer hat und einige Zeilen haben die Felder mit Werten (zB: Sitzungsname). Aber wie die Aufteilung auf die eine oder mehrere gemacht wird Leerzeichen, die Zeilen, die das Leerzeichen im Feld enthalten, erhalten das Feld 3 als Feld2-Wert. Wie können Sie dieses Problem beheben? – user2075017

+0

Überprüfen Sie in einer if-Anweisung einfach, wie viele '$ current' gezählt werden, und überspringen Sie in diesem Fall die Zuweisung der zweiten Eigenschaft. –

+0

können wir die Eigenschaft tatsächlich überspringen, da das zweite Feld Werte für einige der Zeilen enthält. :( – user2075017

2

versuchen, diese

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

$quser | select username, 'logon time' 

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

oder in html

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

start C:\temp\test.html 
+0

Nice one. Ich vergesse immer 'ConvertFrom-Csv' :) –

+0

Danke viel Anthony.will converto-HTML geben die Ausgabe an HTML-Ansicht, als wenn ich früher versuchte es verwendet, um mir die Anzahl der Zeilen anstelle der Daten zu geben.Sie einen Vorschlag? – user2075017