Hosting von PowerShell: PowerShell vs. Runspace vs. RunspacePool vs. Pipeline

9

Ich versuche, in meiner Anwendung eine ziemlich eingeschränkte PowerShell-Unterstützung hinzuzufügen: Ich möchte in der Lage sein, regelmäßig ein benutzerdefiniertes PowerShell-Skript auszuführen und jede Ausgabe anzuzeigen und (eventuell) Fortschrittsbenachrichtigungen und Benutzeranfragen zu verarbeiten. Ich brauche keine interaktive Unterstützung im Befehlszeilenstil oder (glaube ich) den Fernzugriff oder die Fähigkeit, mehrere simultane Skripts auszuführen, es sei denn, das Benutzerskript führt dies selbst aus der von mir gehosteten Shell aus. Ich werde schließlich das Skript asynchron oder in einem Hintergrundthread ausführen und wahrscheinlich die Shell mit einigen Anfangsvariablen und vielleicht einem Cmdlet initiieren, aber das ist so "schick", wie diese Funktion wahrscheinlich erhalten wird.

Ich habe die MSDN-Dokumentation gelesen Host-Anwendungscode schreiben , aber obwohl wie gerne ein PowerShell -Objekt oder Runspace oder RunspacePool oder Pipeline erzeugt, gibt es keinen Hinweis auf < em> warum würde man einen dieser Ansätze gegenüber einem anderen wählen.

Ich denke Ich bin bei einer dieser beiden Fragen, aber ich habe ein Feedback darüber, welche Vorgehensweise besser ist:

%Vor%

oder:

%Vor%

(Eine der erforderlichen PSHost -abgeleiteten Klassenmethoden ist EnterNestedPrompt() , und ich weiß nicht, ob das benutzerdefinierte Skript, das ich ausführe, dazu führen könnte, dass es aufgerufen wird oder nicht. Wenn es möglich ist, dann ' Ich bin verantwortlich für das "Starten einer neuen geschachtelten Eingangsschleife" ( wie hier ) ... wenn das einen Einfluss darauf hat, welchen Weg man einschlagen sollte, wäre das auch gut zu wissen.)

Danke!

    
JaredReisinger 02.05.2013, 02:33
quelle

1 Antwort

1

Sie überschätzen es. Der Code, den Sie in Beispielen zeigen, ist ein guter Anfang. Jetzt müssen Sie nur das Ergebnis von Invoke () lesen und die Fehler- und Warnströme überprüfen.

Der PowerShell-Host bietet einige Hooks, die RunSpace für die Kommunikation mit Benutzern verwenden kann, z. B. Streamen und Formatieren von Ausgaben, Anzeigen des Fortschritts, Melden von Fehlern usw. Für das, was Sie tun möchten, benötigen Sie keinen PowerShell-Host. Sie können die Ergebnisse mithilfe der PowerShell-Klasse aus der Skriptausführung zurücklesen, nach Fehlern und Warnungen suchen, Ausgabeströme lesen und dem Benutzer mithilfe der Funktionen Ihrer Anwendung eine Benachrichtigung anzeigen. Dies ist viel einfacher und effektiver als den gesamten PowerShell-Host zu schreiben, um ein Meldungsfeld anzuzeigen, wenn Fehler gefunden wurden.

Außerdem hat das PowerShell-Objekt beim Erstellen eine Runspace-Eigenschaft, die Sie nicht benötigen. Wenn Sie den Runspace beibehalten müssen, um die Umgebung beizubehalten, behalten Sie das gesamte PowerShell-Objekt bei und löschen Sie jedes Mal, nachdem Sie Invoke aufgerufen haben, Commands und alle Streams.

Die nächste Frage, die Sie sich stellen sollten, ist, wie Sie das Ergebnis von PowerShell :: Invoke () verarbeiten und PowerShell :: Streams lesen können.

    
Serjx86 10.01.2014 20:24
quelle