2016-06-30 16 views
1

Ich habe ein kleines Skript, das Benutzer in unserer Umgebung Schatten die Sitzungen von anderen Benutzern in den Einrichtungen (Ich arbeite in der Unternehmenszentrale, Corporate Benutzer müssen die Fähigkeit, andere Benutzer Sitzungen Schatten entlang verschiedener Seiten)Powershell - Grab spezifische Informationen von Array-Problem

So habe ich dieses:

$servers = "server1, server2, server3, server4, server5" 

#search for user in servers farm 
foreach ($server in $servers) { 

$results = & qwinsta.exe $userid /server:$server 

    if ($results -ne $null) { 

     write-host "User found in $server" 

     $serverfound = $server 

     write-host $results[1] 

     $sessionid = $results[1] | Where-Object { $_ -is 0..99} 

     write-host "Session ID is: $sessionid" 
    } 
} 

Allerdings habe ich nicht die Session-ID aus dem Ergebnis zu packen bekommen kann, ist dies die Ausgabe des Skripts:

Ple ase warten Sie, während wir für x2adm auf den RDSfarm Server

Benutzer gefunden in Server5

rdp-tcp # 0 x2adm 2 Aktive

Session ID ist zu suchen:

ich einfach versuche zu Nimm die Nummer in der Ausgabe und weise sie $ sessionid zu, damit ich den Shadowing-Prozess vollständig automatisieren kann.

Jede Hilfe wird geschätzt. Danke im Voraus.

+0

Es gibt eine gute Antwort hier, um Ihnen zu helfen: http://stackoverflow.com/questions/23445175/qwinsta-serversomesrv-equivalent-in-powershell – sodawillow

+1

Ich denke, Ihr Problem ist mit $ servers = "server1, server2, server3 , server4, server5 ". Sollte $ servers = "server1", "server2", "server3", "server4", "server5" sein, so erhalten Sie ein Array mit 5 Elementen. –

+0

Ich stimme Dan zu, du hast ihm nur eine Zeichenfolge und nicht 5 einzelne Elemente übergeben. –

Antwort

2

Ich würde empfehlen, stattdessen ConvertFrom-String zu verwenden. Es ist großartig, solche Daten zu analysieren.

ConvertFrom-String $results[1] 

P1 : 
P2 : console 
P3 : Stephen 
P4 : 1 
P5 : Active 
P6 : 

Also unsere $SessionID Wert würde in p4 zu finden (P # ist nur ein beliebiger Name, dass dieses Cmdlets die Saiten gibt es findet).

würde Der vollständige Befehl

sein
$sessionID = convertfrom-string $results[1] | select -expand P4 

Dies wird mit dem aktuellen Code ohne weitere Modifikationen arbeiten.

+0

Ich habe ConvertFrom-String vergessen. So verwendet ConvertFrom-StringData – Matt

+0

Wenn es funktioniert, ist CFS nicht von Magie zu unterscheiden. – FoxDeploy

+0

Es tut mir leid für meine Verzögerung Arbeit wurde in den letzten Wochen sehr beschäftigt, diese Lösung funktionierte genau das, was ich brauchte, um die Automatisierung zu beenden. Ich schätze es sehr. –

1

Überprüfen Sie den Datentyp $servers und Sie werden sehen, dass es eine Zeichenfolge und kein String-Array ist, wie Sie es behandeln.

PS C:\Users\matt> $servers = "server1, server2, server3, server4, server5" 
PS C:\Users\matt> $servers.GetType().FullName 

System.String 

Sie können mehr über die grundlegenden Konzepte von Arrays aus about_arrays Sie müssen lesen es wie folgt zu definieren.

$servers = "server1", "server2", "server3", "server4", "server5" 

Soweit I have an answer that converts data from that into a PowerShell object mit Ausgabe von qwinsta beschäftigen. Muss nicht so extrem sein, da Sie nicht den gleichen Befehl verwenden, den das Op der verknüpften Frage war. Point-Sein ist, dass ConvertFrom-StringData ein leistungsfähiges Cmdlet ist.

+0

Es gibt ein Array zurück, wenn der Benutzername mit einer Nummer beginnt, das ist das letzte Problem, das ich damit habe ich kann nicht in der Lage sein, es in eine Zeichenfolge zu konvertieren, habe ich versucht: [string []] $ Ergebnisse = & qwinsta.exe "$ userid"/server: $ server [string] $ results = & qwinsta.exe "$ userid"/server: $ server Ergebnisse $ -join '' und der Typ entweder kommt back array oder object, wie kann ich dafür sorgen, dass eine string zurückgegeben wird? –