Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Beispiel wird gezeigt, wie Sie eine Hostanwendung implementieren, die einen benutzerdefinierten Host verwendet. In diesem Beispiel wird ein Runspace erstellt, der den benutzerdefinierten Host verwendet, und dann wird die System.Management.Automation.PowerShell-API verwendet, um ein Skript auszuführen, das "exit" aufruft. Die Hostanwendung untersucht dann die Ausgabe des Skripts und druckt die Ergebnisse aus.
In diesem Beispiel werden die standardmäßigen Ui-Features von Windows PowerShell verwendet. Weitere Informationen zum Implementieren der UI-Features eines benutzerdefinierten Hosts finden Sie unter Host02-Beispiel-.
Anforderungen
In diesem Beispiel ist Windows PowerShell 2.0 erforderlich.
Veranschaulichung
Erstellen einer benutzerdefinierten Hostklasse, die von der System.Management.Automation.Host.PSHost Klasse abgeleitet wird.
Erstellen eines Runspaces, das die benutzerdefinierte Hostklasse verwendet.
Erstellen eines System.Management.Automation.PowerShell--Objekts, das ein Skript ausführt, das das Beenden aufruft.
Überprüfen, ob der richtige Exitcode im Beendigungsprozess verwendet wurde.
Beispiel 1
Der folgende Code zeigt eine Implementierung einer Hostanwendung, die eine einfache benutzerdefinierte Hostschnittstelle verwendet.
namespace Microsoft.Samples.PowerShell.Host
{
using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using PowerShell = System.Management.Automation.PowerShell;
/// <summary>
/// This class contains the Main entry point for this host application.
/// </summary>
internal class Host01
{
/// <summary>
/// Indicator to tell the host application that it should exit.
/// </summary>
private bool shouldExit;
/// <summary>
/// The exit code that the host application will use to exit.
/// </summary>
private int exitCode;
/// <summary>
/// Gets or sets a value indicating whether the
/// host application should exit.
/// </summary>
public bool ShouldExit
{
get { return this.shouldExit; }
set { this.shouldExit = value; }
}
/// <summary>
/// Gets or sets the PSHost implementation that is
/// used to tell the host application what code to use
/// when exiting.
/// </summary>
public int ExitCode
{
get { return this.exitCode; }
set { this.exitCode = value; }
}
/// <summary>
/// This sample uses a PowerShell object to run
/// a script that calls exit. The host application looks at
/// this and prints out the result.
/// </summary>
/// <param name="args">Parameter not used.</param>
private static void Main(string[] args)
{
// Create an instance of this host application class so that
// the Windows PowerShell engine will have access to the
// ShouldExit and ExitCode parameters.
Host01 me = new Host01();
// Create the host instance to use.
MyHost myHost = new MyHost(me);
// Create a runspace that uses the host object and run the
// script using a PowerShell object.
using (Runspace myRunSpace = RunspaceFactory.CreateRunspace(myHost))
{
// Open the runspace.
myRunSpace.Open();
// Create a PowerShell object to run the script.
using (PowerShell powershell = PowerShell.Create())
{
powershell.Runspace = myRunSpace;
// Create the pipeline and run the script
// "exit (2+2)".
string script = "exit (2+2)";
powershell.AddScript(script);
powershell.Invoke(script);
}
// Check the flags and see if they were set properly.
Console.WriteLine(
"ShouldExit={0} (should be True); ExitCode={1} (should be 4)",
me.ShouldExit,
me.ExitCode);
// close the runspace to free resources.
myRunSpace.Close();
}
Console.WriteLine("Hit any key to exit...");
Console.ReadKey();
}
}
}
Beispiel 2
Der folgende Code ist die Implementierung der System.Management.Automation.Host.PSHost Klasse, die von dieser Hostanwendung verwendet wird. Diese Elemente, die nicht implementiert werden, lösen eine Ausnahme aus oder geben nichts zurück.
namespace Microsoft.Samples.PowerShell.Host
{
using System;
using System.Globalization;
using System.Management.Automation.Host;
/// <summary>
/// This is a sample implementation of the PSHost abstract class for
/// console applications. Not all members are implemented. Those that
/// are not implemented throw a NotImplementedException exception or
/// return nothing.
/// </summary>
internal class MyHost : PSHost
{
/// <summary>
/// A reference to the PSHost implementation.
/// </summary>
private Host01 program;
/// <summary>
/// The culture information of the thread that created
/// this object.
/// </summary>
private CultureInfo originalCultureInfo =
System.Threading.Thread.CurrentThread.CurrentCulture;
/// <summary>
/// The UI culture information of the thread that created
/// this object.
/// </summary>
private CultureInfo originalUICultureInfo =
System.Threading.Thread.CurrentThread.CurrentUICulture;
/// <summary>
/// The identifier of this PSHost implementation.
/// </summary>
private Guid myId = Guid.NewGuid();
/// <summary>
/// Initializes a new instance of the MyHost class. Keep
/// a reference to the host application object so that it
/// can be informed of when to exit.
/// </summary>
/// <param name="program">
/// A reference to the host application object.
/// </param>
public MyHost(Host01 program)
{
this.program = program;
}
/// <summary>
/// Return the culture information to use. This implementation
/// returns a snapshot of the culture information of the thread
/// that created this object.
/// </summary>
public override System.Globalization.CultureInfo CurrentCulture
{
get { return this.originalCultureInfo; }
}
/// <summary>
/// Return the UI culture information to use. This implementation
/// returns a snapshot of the UI culture information of the thread
/// that created this object.
/// </summary>
public override System.Globalization.CultureInfo CurrentUICulture
{
get { return this.originalUICultureInfo; }
}
/// <summary>
/// This implementation always returns the GUID allocated at
/// instantiation time.
/// </summary>
public override Guid InstanceId
{
get { return this.myId; }
}
/// <summary>
/// Return a string that contains the name of the host implementation.
/// Keep in mind that this string may be used by script writers to
/// identify when your host is being used.
/// </summary>
public override string Name
{
get { return "MySampleConsoleHostImplementation"; }
}
/// <summary>
/// This sample does not implement a PSHostUserInterface component so
/// this property simply returns null.
/// </summary>
public override PSHostUserInterface UI
{
get { return null; }
}
/// <summary>
/// Return the version object for this application. Typically this
/// should match the version resource in the application.
/// </summary>
public override Version Version
{
get { return new Version(1, 0, 0, 0); }
}
/// <summary>
/// Not implemented by this example class. The call fails with
/// a NotImplementedException exception.
/// </summary>
public override void EnterNestedPrompt()
{
throw new NotImplementedException(
"The method or operation is not implemented.");
}
/// <summary>
/// Not implemented by this example class. The call fails
/// with a NotImplementedException exception.
/// </summary>
public override void ExitNestedPrompt()
{
throw new NotImplementedException(
"The method or operation is not implemented.");
}
/// <summary>
/// This API is called before an external application process is
/// started. Typically it is used to save state so the parent can
/// restore state that has been modified by a child process (after
/// the child exits). In this example, this functionality is not
/// needed so the method returns nothing.
/// </summary>
public override void NotifyBeginApplication()
{
return;
}
/// <summary>
/// This API is called after an external application process finishes.
/// Typically it is used to restore state that a child process may
/// have altered. In this example, this functionality is not
/// needed so the method returns nothing.
/// </summary>
public override void NotifyEndApplication()
{
return;
}
/// <summary>
/// Indicate to the host application that exit has
/// been requested. Pass the exit code that the host
/// application should use when exiting the process.
/// </summary>
/// <param name="exitCode">The exit code to use.</param>
public override void SetShouldExit(int exitCode)
{
this.program.ShouldExit = true;
this.program.ExitCode = exitCode;
}
}
}