2016-10-21 5 views
0

Ich interessiere mich für .NET Objektverweise für die verschiedenen Streams, die mit einem Powershell-Host kommen (stdin, plus die 5 Ausgabeströme Debug, Info, Fehler, etc.) Ich bin daran interessiert, diese an benutzerdefinierte .NET-Typen zu übergeben werden KEINE Cmdlets sein ... nur .NET-Typen, die 5 Ausgabestreams und 1 Eingabestream erwarten.Verweise auf PowerShell-Stream-Objekte?

Ich habe viel Zeit mit googeln und msdning verbracht und ich kann einfach keine Informationen über diese Streams finden, die über die Cmdlets hinausgehen, die sie lesen/schreiben.

Wenn dies nicht möglich ist, würde ein Link zu einer entsprechenden Dokumentation eine Antwort geben.

aktualisiert

Danke für das Feedback so weit, und sorry für die Verzögerung es zurück auf diese Frage zu machen.

@CharlieJoynd die Idee hier ist, dass ich PowerShell als Einstiegspunkt für eine Reihe von benutzerdefinierten .NET-Typen verwenden werde. Diese Typen werden auch in andere Klassenbibliotheken und EXEs importiert, sodass sie nicht PowerShell-spezifisch sein können. Alles, was die Typen hostet, wird jedoch Streams für die Ausgabe von info/log/error/etc bereitstellen (anstatt ein spezifisches Logging-Framework wie log4net zu wählen).

@PetSerAl Ich bin mir nicht sicher, was eine XY-Frage ist? Wenn mein Update nicht die Klarheit bringt, nach der Sie suchen, können Sie klären, was die Lücke ist (: P)?

Nochmals vielen Dank für die Rückmeldung, Leute.

+0

Aussehen wie XY Frage für mich. Was versuchst du wirklich zu erreichen? Und warum brauchen Sie dafür Referenzen auf PowerShell Stream-Objekte? – PetSerAl

+0

Ja, ein wenig Klarheit hilft hier bei einer ziemlich interessanten Frage. Versuchen Sie beispielsweise, dieses Problem innerhalb von * PowerShell (z. B. Protokollierung unterschiedlicher Streams in verschiedene Protokolldateien) oder in der Umgebung * um * PowerShell (z. B. beim Schreiben eines benutzerdefinierten Hosts) zu lösen. –

+0

@Paul, eine XY-Frage wird hier auf der "Meta" -Seite für dieses Forum diskutiert: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

Antwort

1

Ich konnte mit dem Cmdlet Register-ObjectEvent Daten abfangen, die in bestimmte Streams geschrieben wurden.

Register-Object

https://technet.microsoft.com/en-us/library/hh849929.aspx

Das Register-Object Cmdlets abonniert Ereignisse, die erzeugt von .NET Framework-Objekte auf dem lokalen Computer oder auf einem Remote-Computer sind. Wenn das abonnierte Ereignis ausgelöst wird, wird es der Ereigniswarteschlange in Ihrer Sitzung zu hinzugefügt. Verwenden Sie das Get-Event-Cmdlet, um Ereignisse in der Ereigniswarteschlange abzurufen.

Sie können die Parameter von Register-Object verwenden Eigenschaftswerte der Ereignisse angeben, die das Ereignis in der Warteschlange identifizieren helfen können. Sie können auch den Aktionsparameter verwenden, um die Aktionen festzulegen, die ausgeführt werden sollen, wenn ein abonniertes Ereignis ausgelöst wird, und den Parameter Forwarding an , um ferne Ereignisse an die Ereigniswarteschlange in der lokalen Sitzung zu senden.

In meinem Fall habe ich ein neues System.Diagnostics.Process Objekt als $ Prozess geschaffen hatte, aber vor diesen Prozess beginnen registriert ich einige Event-Handler, die als Jobs vorhanden ist, zum Beispiel

$StdOutJob = Register-Object-Event -InputObject $Process ` 
    -EventName OutputDataReceived -Action $ScriptBlock 

... wo $ScriptBlock a vorher festgelegten Skriptblock, der die Ereignisse aus diesem Strom kommenden behandelt.Innerhalb dieses Skript Block sind die Ereignisse zugänglich über einige integrierte Variablen:

Der Wert des Aktion Parameter können die $ Ereignis, umfassen $ EventSubscriber, $ Sender, $ EventArgs und $ Args automatische Variablen, die Informationen über das Ereignis zu der Aktion Skriptblock bereitstellen.

So könnte Ihr Script nehmen $EventArgs.Data und etwas damit machen.

Haftungsausschluss: Sie erwähnen, nur OutputDataReceived und ErrorDataReceived Ich habe nicht diese Methode verwendet, um zu versuchen, alle Ströme abzufangen.

+0

Wenn ich etwas runter habe Zeit werde ich in dieses Register-ObjectEvent-Geschäft einsteigen und sehen, ob ich die Aufgabe damit erfüllen kann. Wenn ja, poste ich, was ich getan habe. –

Verwandte Themen