当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 主机04样本

作者:精品下载站 日期:2024-12-14 02:45:41 浏览:15 分类:玩电脑

主机04样本


此示例演示如何构建基于交互式控制台的主机应用程序,该应用程序从命令行读取命令、执行命令,然后将结果显示到控制台。该主机应用程序还支持显示允许用户指定多个选择的提示。

要求

此示例需要 Windows PowerShell 2.0。

示范

  • 创建一个自定义主机,其类派生自 System.Management.Automation.Host.PSHost 类、System.Management.Automation.Host.PSHostUserInterface 类和 System.Management.Automation.Host.PSHostRawUserInterface 类。

  • 构建一个使用这些主机类来构建交互式 Windows PowerShell shell 的控制台应用程序。

  • 创建 $profile 变量并加载以下配置文件。

    • 当前用户、当前主机
  • 当前用户,所有主机
  • 所有用户,当前主机
  • 所有用户、所有主机
  • 实现 System.Management.Automation.Host.IHostUISupportsMultipleChoiceSelection 接口。

  • 实施例1

    此示例允许用户在命令行输入命令,处理这些命令,然后打印结果。

    namespace Microsoft.Samples.PowerShell.Host
    {
      using System;
      using System.Collections.ObjectModel;
      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 PSListenerConsoleSample
      {
        /// <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>
        /// Holds a reference to  the PSHost object for this interpreter.
        /// </summary>
        private MyHost myHost;
    
        /// <summary>
        /// Holds a reference to the runspace for this interpreter.
        /// </summary>
        private Runspace myRunSpace;
    
        /// <summary>
        /// Holds a reference to the currently executing pipeline so that
        /// it can be stopped by the control-C handler.
        /// </summary>
        private PowerShell currentPowerShell;
    
        /// <summary>
        /// Used to serialize access to instance data.
        /// </summary>
        private object instanceLock = new object();
    
        /// <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 exit code that the host application will use
        /// when exiting.
        /// </summary>
        public int ExitCode
        {
          get { return this.exitCode; }
          set { this.exitCode = value; }
        }
    
        /// <summary>
        /// Creates and initiates the listener.
        /// </summary>
        /// <param name="args">The parameter is not used</param>
        private static void Main(string[] args)
        {
          // Display the welcome message.
          Console.Title = "Windows PowerShell Console Host Application Sample";
          ConsoleColor oldFg = Console.ForegroundColor;
          Console.ForegroundColor = ConsoleColor.Cyan;
          Console.WriteLine("    Windows PowerShell Console Host Interactive Sample");
          Console.WriteLine("    ==================================================");
          Console.WriteLine(string.Empty);
          Console.WriteLine("This is an example of a simple interactive console host that uses ");
          Console.WriteLine("the Windows PowerShell engine to interpret commands.");
          Console.WriteLine("Type 'exit' to exit.");
          Console.WriteLine(string.Empty);
          Console.ForegroundColor = oldFg;
    
          // Create the listener and run it. This never returns.
          PSListenerConsoleSample listener = new PSListenerConsoleSample();
          listener.Run();
        }
    
        /// <summary>
        /// Create this instance of the console listener.
        /// </summary>
        private PSListenerConsoleSample()
        {
          // Create the host and runspace instances for this interpreter. Note that
          // this application doesn't support console files so only the default snapins
          // will be available.
          this.myHost = new MyHost(this);
          this.myRunSpace = RunspaceFactory.CreateRunspace(this.myHost);
          this.myRunSpace.Open();
    
          // Create a PowerShell object that will be used to execute the commands
          // to create $profile and load the profiles.
          lock (this.instanceLock)
          {
            this.currentPowerShell = PowerShell.Create();
          }
    
          try
          {
            this.currentPowerShell.Runspace = this.myRunSpace;
    
            PSCommand[] profileCommands = Microsoft.Samples.PowerShell.Host.HostUtilities.GetProfileCommands("SampleHost04");
            foreach (PSCommand command in profileCommands)
            {
              this.currentPowerShell.Commands = command;
              this.currentPowerShell.Invoke();
            }
          }
          finally
          {
            // Dispose of the pipeline line and set it to null, locked because currentPowerShell
            // may be accessed by the ctrl-C handler...
            lock (this.instanceLock)
            {
              this.currentPowerShell.Dispose();
              this.currentPowerShell = null;
            }
          }
        }
    
        /// <summary>
        /// A helper class that builds and executes a pipeline that writes to the
        /// default output path. Any exceptions that are thrown are just passed to
        /// the caller. Since all output goes to the default outputter, this method
        /// returns nothing.
        /// </summary>
        /// <param name="cmd">The script to run</param>
        /// <param name="input">Any input arguments to pass to the script. If null
        /// then nothing is passed in.</param>
        private void executeHelper(string cmd, object input)
        {
          // Ignore empty command lines.
          if (String.IsNullOrEmpty(cmd))
          {
            return;
          }
    
          // Create the pipeline object and make it available
          // to the ctrl-C handle through the currentPowerShell instance
          // variable.
          lock (this.instanceLock)
          {
            this.currentPowerShell = PowerShell.Create();
          }
    
          this.currentPowerShell.Runspace = this.myRunSpace;
    
          // Create a pipeline for this execution. Place the result in the
          // currentPowerShell instance variable so that it is available to
          // be stopped.
          try
          {
            this.currentPowerShell.AddScript(cmd);
    
            // Now add the default outputter to the end of the pipe and indicate
            // that it should handle both output and errors from the previous
            // commands. This will result in the output being written using the PSHost
            // and PSHostUserInterface classes instead of returning objects to the hosting
            // application.
            this.currentPowerShell.AddCommand("out-default");
            this.currentPowerShell.Commands.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
    
            // If there was any input specified, pass it in, otherwise just
            // execute the pipeline.
            if (input != null)
            {
              this.currentPowerShell.Invoke(new object[] { input });
            }
            else
            {
              this.currentPowerShell.Invoke();
            }
          }
          finally
          {
            // Dispose of the pipeline line and set it to null, locked because currentPowerShell
            // may be accessed by the ctrl-C handler.
            lock (this.instanceLock)
            {
              this.currentPowerShell.Dispose();
              this.currentPowerShell = null;
            }
          }
        }
    
        /// <summary>
        /// An exception occurred that we want to display
        /// using the display formatter. To do this we run
        /// a second pipeline passing in the error record.
        /// The runtime will bind this to the $input variable
        /// which is why $input is being piped to out-string.
        /// We then call WriteErrorLine to make sure the error
        /// gets displayed in the correct error color.
        /// </summary>
        /// <param name="e">The exception to display</param>
        private void ReportException(Exception e)
        {
          if (e != null)
          {
            object error;
            IContainsErrorRecord icer = e as IContainsErrorRecord;
            if (icer != null)
            {
              error = icer.ErrorRecord;
            }
            else
            {
              error = (object)new ErrorRecord(e, "Host.ReportException", ErrorCategory.NotSpecified, null);
            }
    
            lock (this.instanceLock)
            {
              this.currentPowerShell = PowerShell.Create();
            }
    
            this.currentPowerShell.Runspace = this.myRunSpace;
    
            try
            {
              this.currentPowerShell.AddScript("$input").AddCommand("out-string");
    
              // Do not merge errors, this function will swallow errors.
              Collection<PSObject> result;
              PSDataCollection<object> inputCollection = new PSDataCollection<object>();
              inputCollection.Add(error);
              inputCollection.Complete();
              result = this.currentPowerShell.Invoke(inputCollection);
    
              if (result.Count > 0)
              {
                string str = result[0].BaseObject as string;
                if (!string.IsNullOrEmpty(str))
                {
                  // Remove \r\n that is added by out-string.
                  this.myHost.UI.WriteErrorLine(str.Substring(0, str.Length - 2));
                }
              }
            }
            finally
            {
              // Dispose of the pipeline line and set it to null, locked because currentPowerShell
              // may be accessed by the ctrl-C handler.
              lock (this.instanceLock)
              {
                this.currentPowerShell.Dispose();
                this.currentPowerShell = null;
              }
            }
          }
        }
    
        /// <summary>
        /// Basic script execution routine - any runtime exceptions are
        /// caught and passed back into the engine to display.
        /// </summary>
        /// <param name="cmd">The parameter is not used.</param>
        private void Execute(string cmd)
        {
          try
          {
            // Execute the command with no input.
            this.executeHelper(cmd, null);
          }
          catch (RuntimeException rte)
          {
            this.ReportException(rte);
          }
        }
    
        /// <summary>
        /// Method used to handle control-C's from the user. It calls the
        /// pipeline Stop() method to stop execution. If any exceptions occur
        /// they are printed to the console but otherwise ignored.
        /// </summary>
        /// <param name="sender">See sender property of ConsoleCancelEventHandler documentation.</param>
        /// <param name="e">See e property of ConsoleCancelEventHandler documentation</param>
        private void HandleControlC(object sender, ConsoleCancelEventArgs e)
        {
          try
          {
            lock (this.instanceLock)
            {
              if (this.currentPowerShell != null && this.currentPowerShell.InvocationStateInfo.State == PSInvocationState.Running)
              {
                this.currentPowerShell.Stop();
              }
            }
    
            e.Cancel = true;
          }
          catch (Exception exception)
          {
            this.myHost.UI.WriteErrorLine(exception.ToString());
          }
        }
    
        /// <summary>
        /// Implements the basic listener loop. It sets up the ctrl-C handler, then
        /// reads a command from the user, executes it and repeats until the ShouldExit
        /// flag is set.
        /// </summary>
        private void Run()
        {
          // Set up the control-C handler.
          Console.CancelKeyPress += new ConsoleCancelEventHandler(this.HandleControlC);
          Console.TreatControlCAsInput = false;
    
          // Read commands to execute until ShouldExit is set by
          // the user calling "exit".
          while (!this.ShouldExit)
          {
            this.myHost.UI.Write(ConsoleColor.Cyan, ConsoleColor.Black, "\nPSConsoleSample: ");
            string cmd = Console.ReadLine();
            this.Execute(cmd);
          }
    
          // Exit with the desired exit code that was set by exit command.
          // This is set in the host by the MyHost.SetShouldExit() implementation.
          Environment.Exit(this.ExitCode);
        }
      }
    }
    

    实施例2

    以下代码是此主机应用程序使用的 System.Management.Automation.Host.PSHost 类的实现。那些未实现的元素会抛出异常或不返回任何内容。

    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 PSListenerConsoleSample 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 static Guid instanceId = 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(PSListenerConsoleSample program)
        {
          this.program = program;
        }
    
        /// <summary>
        /// A reference to the implementation of the PSHostUserInterface
        /// class for this application.
        /// </summary>
        private MyHostUserInterface myHostUserInterface = new MyHostUserInterface();
    
        /// <summary>
        /// Gets the culture information to use. This implementation
        /// returns a snapshot of the culture information of the thread
        /// that created this object.
        /// </summary>
        public override CultureInfo CurrentCulture
        {
          get { return this.originalCultureInfo; }
        }
    
        /// <summary>
        /// Gets 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 CultureInfo CurrentUICulture
        {
          get { return this.originalUICultureInfo; }
        }
    
        /// <summary>
        /// Gets an identifier for this host. This implementation always
        /// returns the GUID allocated at instantiation time.
        /// </summary>
        public override Guid InstanceId
        {
          get { return instanceId; }
        }
    
        /// <summary>
        /// Gets a string that contains the name of this 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>
        /// Gets an instance of the implementation of the PSHostUserInterface
        /// class for this application. This instance is allocated once at startup time
        /// and returned every time thereafter.
        /// </summary>
        public override PSHostUserInterface UI
        {
          get { return this.myHostUserInterface; }
        }
    
        /// <summary>
        /// Gets 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>
        /// This API Instructs the host to interrupt the currently running
        /// pipeline and start a new nested input loop. In this example this
        /// functionality is not needed so the method throws a
        /// NotImplementedException exception.
        /// </summary>
        public override void EnterNestedPrompt()
        {
          throw new NotImplementedException(
                "The method or operation is not implemented.");
        }
    
        /// <summary>
        /// This API instructs the host to exit the currently running input loop.
        /// In this example this functionality is not needed so the method
        /// throws 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 that 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 has
        /// 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 that the
        /// host application should use.</param>
        public override void SetShouldExit(int exitCode)
        {
          this.program.ShouldExit = true;
          this.program.ExitCode = exitCode;
        }
      }
    }
    

    实施例3

    以下代码是此主机应用程序使用的 System.Management.Automation.Host.Pshostuserinterface 类的实现。

    namespace Microsoft.Samples.PowerShell.Host
    {
      using System;
      using System.Collections.Generic;
      using System.Collections.ObjectModel;
      using System.Globalization;
      using System.Management.Automation;
      using System.Management.Automation.Host;
      using System.Text;
    
      /// <summary>
      /// A sample implementation of the PSHostUserInterface abstract class for
      /// console applications. Not all members are implemented. Those that are
      /// not implemented throw a NotImplementedException exception or return
      /// nothing. Members that are implemented include those that map easily to
      /// Console APIs and a basic implementation of the prompt API provided.
      /// </summary>
      internal class MyHostUserInterface : PSHostUserInterface, IHostUISupportsMultipleChoiceSelection
      {
        /// <summary>
        /// A reference to the PSRawUserInterface implementation.
        /// </summary>
        private MyRawUserInterface myRawUi = new MyRawUserInterface();
    
        /// <summary>
        /// Gets an instance of the PSRawUserInterface object for this host
        /// application.
        /// </summary>
        public override PSHostRawUserInterface RawUI
        {
          get { return this.myRawUi; }
        }
    
        /// <summary>
        /// Prompts the user for input.
        /// <param name="caption">The caption or title of the prompt.</param>
        /// <param name="message">The text of the prompt.</param>
        /// <param name="descriptions">A collection of FieldDescription objects
        /// that describe each field of the prompt.</param>
        /// <returns>A dictionary object that contains the results of the user
        /// prompts.</returns>
        public override Dictionary<string, PSObject> Prompt(
                                  string caption,
                                  string message,
                                  Collection<FieldDescription> descriptions)
        {
          this.Write(
                     ConsoleColor.Blue,
                     ConsoleColor.Black,
                     caption + "\n" + message + " ");
          Dictionary<string, PSObject> results =
                   new Dictionary<string, PSObject>();
          foreach (FieldDescription fd in descriptions)
          {
            string[] label = GetHotkeyAndLabel(fd.Label);
            this.WriteLine(label[1]);
            string userData = Console.ReadLine();
            if (userData == null)
            {
              return null;
            }
    
            results[fd.Name] = PSObject.AsPSObject(userData);
          }
    
          return results;
        }
    
        /// <summary>
    
    /// Provides a set of choices that enable the user to choose a
        /// single option from a set of options.
        /// </summary>
        /// <param name="caption">Text that proceeds (a title) the choices.</param>
        /// <param name="message">A message that describes the choice.</param>
        /// <param name="choices">A collection of ChoiceDescription objects that
        /// describe each choice.</param>
        /// <param name="defaultChoice">The index of the label in the Choices
        /// parameter collection. To indicate no default choice, set to -1.</param>
        /// <returns>The index of the Choices parameter collection element that
        /// corresponds to the option that is selected by the user.</returns>
        public override int PromptForChoice(
                                            string caption,
                                            string message,
                                            Collection<ChoiceDescription> choices,
                                            int defaultChoice)
        {
          // Write the caption and message strings in Blue.
          this.WriteLine(
                         ConsoleColor.Blue,
                         ConsoleColor.Black,
                         caption + "\n" + message + "\n");
    
          // Convert the choice collection into something that is
          // easier to work with. See the BuildHotkeysAndPlainLabels
          // method for details.
          string[,] promptData = BuildHotkeysAndPlainLabels(choices);
    
          // Format the overall choice prompt string to display.
          StringBuilder sb = new StringBuilder();
          for (int element = 0; element < choices.Count; element++)
          {
            sb.Append(String.Format(
                                    CultureInfo.CurrentCulture,
                                    "|{0}> {1} ",
                                    promptData[0, element],
                                    promptData[1, element]));
          }
    
          sb.Append(String.Format(
                                  CultureInfo.CurrentCulture,
                                  "[Default is ({0}]",
                                  promptData[0, defaultChoice]));
    
          // Read prompts until a match is made, the default is
          // chosen, or the loop is interrupted with ctrl-C.
          while (true)
          {
            this.WriteLine(ConsoleColor.Cyan, ConsoleColor.Black, sb.ToString());
            string data = Console.ReadLine().Trim().ToUpper(CultureInfo.CurrentCulture);
    
            // If the choice string was empty, use the default selection.
            if (data.Length == 0)
            {
              return defaultChoice;
            }
    
            // See if the selection matched and return the
            // corresponding index if it did.
            for (int i = 0; i < choices.Count; i++)
            {
              if (promptData[0, i] == data)
              {
                return i;
              }
            }
    
            this.WriteErrorLine("Invalid choice: " + data);
          }
        }
    
        #region IHostUISupportsMultipleChoiceSelection Members
    
        /// <summary>
        /// Provides a set of choices that enable the user to choose a one or
        /// more options from a set of options.
        /// </summary>
        /// <param name="caption">Text that proceeds (a title) the choices.</param>
        /// <param name="message">A message that describes the choice.</param>
        /// <param name="choices">A collection of ChoiceDescription objects that
        /// describe each choice.</param>
        /// <param name="defaultChoices">The index of the label in the Choices
        /// parameter collection. To indicate no default choice, set to -1.</param>
        /// <returns>The index of the Choices parameter collection element that
        /// corresponds to the option that is selected by the user.</returns>
        public Collection<int> PromptForChoice(
                                               string caption,
                                               string message,
                                               Collection<ChoiceDescription> choices,
                                               IEnumerable<int> defaultChoices)
        {
          // Write the caption and message strings in Blue.
          this.WriteLine(
                         ConsoleColor.Blue,
                         ConsoleColor.Black,
                         caption + "\n" + message + "\n");
    
          // Convert the choice collection into something that is
          // easier to work with. See the BuildHotkeysAndPlainLabels
          // method for details.
          string[,] promptData = BuildHotkeysAndPlainLabels(choices);
    
          // Format the overall choice prompt string to display.
          StringBuilder sb = new StringBuilder();
          for (int element = 0; element < choices.Count; element++)
          {
            sb.Append(String.Format(
                                    CultureInfo.CurrentCulture,
                                    "|{0}> {1} ",
                                    promptData[0, element],
                                    promptData[1, element]));
          }
    
          Collection<int> defaultResults = new Collection<int>();
          if (defaultChoices != null)
          {
            int countDefaults = 0;
            foreach (int defaultChoice in defaultChoices)
            {
              ++countDefaults;
              defaultResults.Add(defaultChoice);
            }
    
            if (countDefaults != 0)
            {
              sb.Append(countDefaults == 1 ? "[Default choice is " : "[Default choices are ");
              foreach (int defaultChoice in defaultChoices)
              {
                sb.AppendFormat(
                                CultureInfo.CurrentCulture,
                                "\"{0}\",",
                                promptData[0, defaultChoice]);
              }
    
              sb.Remove(sb.Length - 1, 1);
              sb.Append("]");
            }
          }
    
          this.WriteLine(
                         ConsoleColor.Cyan,
                         ConsoleColor.Black,
                         sb.ToString());
          // Read prompts until a match is made, the default is
          // chosen, or the loop is interrupted with ctrl-C.
          Collection<int> results = new Collection<int>();
          while (true)
          {
            ReadNext:
            string prompt = string.Format(CultureInfo.CurrentCulture, "Choice[{0}]:", results.Count);
            this.Write(ConsoleColor.Cyan, ConsoleColor.Black, prompt);
            string data = Console.ReadLine().Trim().ToUpper(CultureInfo.CurrentCulture);
    
            // If the choice string was empty, no more choices have been made.
            // If there were no choices made, return the defaults
            if (data.Length == 0)
            {
              return (results.Count == 0) ? defaultResults : results;
            }
    
            // See if the selection matched and return the
            // corresponding index if it did.
            for (int i = 0; i < choices.Count; i++)
            {
              if (promptData[0, i] == data)
              {
                results.Add(i);
                goto ReadNext;
              }
            }
    
            this.WriteErrorLine("Invalid choice: " + data);
          }
        }
    
        #endregion
    
        /// <summary>
        /// Prompts the user for credentials with a specified prompt window
        /// caption, prompt message, user name, and target name. In this
        /// example this functionality is not needed so the method throws a
        /// NotImplementException exception.
        /// </summary>
        /// <param name="caption">The caption for the message window.</param>
        /// <param name="message">The text of the message.</param>
        /// <param name="userName">The user name whose credential is to be
        /// prompted for.</param>
        /// <param name="targetName">The name of the target for which the
        /// credential is collected.</param>
        /// <returns>Throws a NotImplementedException exception.</returns>
        public override PSCredential PromptForCredential(
                                                         string caption,
                                                         string message,
                                                         string userName,
                                                         string targetName)
        {
          throw new NotImplementedException(
                               "The method or operation is not implemented.");
        }
    
        /// <summary>
        /// Prompts the user for credentials by using a specified prompt window
        /// caption, prompt message, user name and target name, credential
        /// types allowed to be returned, and UI behavior options. In this
        /// example this functionality is not needed so the method throws a
        /// NotImplementException exception.
        /// </summary>
        /// <param name="caption">The caption for the message window.</param>
        /// <param name="message">The text of the message.</param>
        /// <param name="userName">The user name whose credential is to be
        /// prompted for.</param>
        /// <param name="targetName">The name of the target for which the
        /// credential is collected.</param>
        /// <param name="allowedCredentialTypes">A PSCredentialTypes constant
        /// that identifies the type of credentials that can be returned.</param>
        /// <param name="options">A PSCredentialUIOptions constant that
        /// identifies the UI behavior when it gathers the credentials.</param>
        /// <returns>Throws a NotImplementedException exception.</returns>
        public override PSCredential PromptForCredential(
                                           string caption,
                                           string message,
                                           string userName,
                                           string targetName,
                                           PSCredentialTypes allowedCredentialTypes,
                                           PSCredentialUIOptions options)
        {
          throw new NotImplementedException(
                                  "The method or operation is not implemented.");
        }
    
        /// <summary>
        /// Reads characters that are entered by the user until a newline
        /// (carriage return) is encountered.
        /// </summary>
        /// <returns>The characters that are entered by the user.</returns>
        public override string ReadLine()
        {
          return Console.ReadLine();
        }
    
        /// <summary>
        /// Reads characters entered by the user until a newline (carriage return)
        /// is encountered and returns the characters as a secure string. In this
        /// example this functionality is not needed so the method throws a
        /// NotImplementException exception.
        /// </summary>
        /// <returns>Throws a NotImplemented exception.</returns>
        public override System.Security.SecureString ReadLineAsSecureString()
        {
          throw new NotImplementedException("The method or operation is not implemented.");
        }
    
        /// <summary>
        /// Writes characters to the output display of the host.
        /// </summary>
        /// <param name="value">The characters to be written.</param>
        public override void Write(string value)
        {
          Console.Write(value);
        }
    
        /// <summary>
        /// Writes characters to the output display of the host with possible
        /// foreground and background colors.
        /// </summary>
        /// <param name="foregroundColor">The color of the characters.</param>
        /// <param name="backgroundColor">The background color to use.</param>
        /// <param name="value">The characters to be written.</param>
        public override void Write(
                                   ConsoleColor foregroundColor,
                                   ConsoleColor backgroundColor,
                                   string value)
        {
          ConsoleColor oldFg = Console.ForegroundColor;
          ConsoleColor oldBg = Console.BackgroundColor;
          Console.ForegroundColor = foregroundColor;
          Console.BackgroundColor = backgroundColor;
          Console.Write(value);
          Console.ForegroundColor = oldFg;
          Console.BackgroundColor = oldBg;
        }
    
        /// <summary>
        /// Writes a line of characters to the output display of the host
        /// with foreground and background colors and appends a newline (carriage return).
        /// </summary>
        /// <param name="foregroundColor">The foreground color of the display. </param>
        /// <param name="backgroundColor">The background color of the display. </param>
        /// <param name="value">The line to be written.</param>
        public override void WriteLine(
                                       ConsoleColor foregroundColor,
                                       ConsoleColor backgroundColor,
                                       string value)
        {
          ConsoleColor oldFg = Console.ForegroundColor;
          ConsoleColor oldBg = Console.BackgroundColor;
          Console.ForegroundColor = foregroundColor;
          Console.BackgroundColor = backgroundColor;
          Console.WriteLine(value);
          Console.ForegroundColor = oldFg;
          Console.BackgroundColor = oldBg;
        }
    
        /// <summary>
        /// Writes a debug message to the output display of the host.
        /// </summary>
        /// <param name="message">The debug message that is displayed.</param>
        public override void WriteDebugLine(string message)
        {
          this.WriteLine(
                         ConsoleColor.DarkYellow,
                         ConsoleColor.Black,
                         String.Format(CultureInfo.CurrentCulture, "DEBUG: {0}", message));
        }
    
        /// <summary>
        /// Writes an error message to the output display of the host.
        /// </summary>
        /// <param name="value">The error message that is displayed.</param>
        public override void WriteErrorLine(string value)
        {
          this.WriteLine(
                         ConsoleColor.Red,
                         ConsoleColor.Black,
                         value);
        }
    
        /// <summary>
        /// Writes a newline character (carriage return)
        /// to the output display of the host.
        /// </summary>
        public override void WriteLine()
        {
          Console.WriteLine();
        }
    
           /// <summary>
        /// Writes a line of characters to the output display of the host
        /// and appends a newline character(carriage return).
        /// </summary>
        /// <param name="value">The line to be written.</param>
        public override void WriteLine(string value)
        {
          Console.WriteLine(value);
        }
    
        /// <summary>
        /// Writes a progress report to the output display of the host.
        /// </summary>
        /// <param name="sourceId">Unique identifier of the source of the record. </param>
        /// <param name="record">A ProgressReport object.</param>
        public override void WriteProgress(long sourceId, ProgressRecord record)
        {
    
        }
    
        /// <summary>
        /// Writes a verbose message to the output display of the host.
        /// </summary>
        /// <param name="message">The verbose message that is displayed.</param>
        public override void WriteVerboseLine(string message)
        {
          this.WriteLine(
                         ConsoleColor.Green,
                         ConsoleColor.Black,
                         String.Format(CultureInfo.CurrentCulture, "VERBOSE: {0}", message));
        }
    
        /// <summary>
        /// Writes a warning message to the output display of the host.
        /// </summary>
        /// <param name="message">The warning message that is displayed.</param>
        public override void WriteWarningLine(string message)
        {
          this.WriteLine(
                         ConsoleColor.Yellow,
                         ConsoleColor.Black,
                         String.Format(CultureInfo.CurrentCulture, "WARNING: {0}", message));
        }
    
        /// <summary>
        /// Parse a string containing a hotkey character.
        /// Take a string of the form
        ///    Yes to &all
        /// and returns a two-dimensional array split out as
        ///    "A", "Yes to all".
        /// </summary>
        /// <param name="input">The string to process</param>
        /// <returns>
        /// A two dimensional array containing the parsed components.
        /// </returns>
        private static string[] GetHotkeyAndLabel(string input)
        {
          string[] result = new string[] { String.Empty, String.Empty };
          string[] fragments = input.Split('&');
          if (fragments.Length == 2)
          {
            if (fragments[1].Length > 0)
            {
              result[0] = fragments[1][0].ToString().
              ToUpper(CultureInfo.CurrentCulture);
            }
    
            result[1] = (fragments[0] + fragments[1]).Trim();
          }
          else
          {
            result[1] = input;
          }
    
          return result;
        }
    
        /// <summary>
        /// This is a private worker function splits out the
        /// accelerator keys from the menu and builds a two
        /// dimensional array with the first access containing the
        /// accelerator and the second containing the label string
        /// with the & removed.
        /// </summary>
        /// <param name="choices">The choice collection to process</param>
        /// <returns>
        /// A two dimensional array containing the accelerator characters
        /// and the cleaned-up labels</returns>
        private static string[,] BuildHotkeysAndPlainLabels(
             Collection<ChoiceDescription> choices)
        {
          // Allocate the result array
          string[,] hotkeysAndPlainLabels = new string[2, choices.Count];
    
          for (int i = 0; i < choices.Count; ++i)
          {
            string[] hotkeyAndLabel = GetHotkeyAndLabel(choices[i].Label);
            hotkeysAndPlainLabels[0, i] = hotkeyAndLabel[0];
            hotkeysAndPlainLabels[1, i] = hotkeyAndLabel[1];
          }
    
          return hotkeysAndPlainLabels;
        }
      }
    }
    

    实施例4

    以下代码是此主机应用程序使用的 System.Management.Automation.Host.Pshostrawuserinterface 类的实现。那些未实现的元素会抛出异常或不返回任何内容。

    namespace Microsoft.Samples.PowerShell.Host
    {
      using System;
      using System.Management.Automation.Host;
    
      /// <summary>
      /// A sample implementation of the PSHostRawUserInterface for console
      /// applications. Members of this class that easily map to the .NET
      /// console class are implemented. More complex methods are not
      /// implemented and throw a NotImplementedException exception.
      /// </summary>
      internal class MyRawUserInterface : PSHostRawUserInterface
      {
        /// <summary>
        /// Gets or sets the background color of text to be written.
        /// This maps to the corresponding Console.Background property.
        /// </summary>
        public override ConsoleColor BackgroundColor
        {
          get { return Console.BackgroundColor; }
          set { Console.BackgroundColor = value; }
        }
    
        /// <summary>
        /// Gets or sets the host buffer size adapted from the Console buffer
        /// size members.
        /// </summary>
        public override Size BufferSize
        {
          get { return new Size(Console.BufferWidth, Console.BufferHeight); }
          set { Console.SetBufferSize(value.Width, value.Height); }
        }
    
         /// <summary>
        /// Gets or sets the cursor position. In this example this
        /// functionality is not needed so the property throws a
        /// NotImplementException exception.
        /// </summary>
        public override Coordinates CursorPosition
        {
          get { throw new NotImplementedException(
                     "The method or operation is not implemented."); }
          set { throw new NotImplementedException(
                     "The method or operation is not implemented."); }
        }
    
        /// <summary>
        /// Gets or sets the cursor size taken directly from the
        /// Console.CursorSize property.
        /// </summary>
        public override int CursorSize
        {
          get { return Console.CursorSize; }
          set { Console.CursorSize = value; }
        }
    
        /// <summary>
        /// Gets or sets the foreground color of the text to be written.
        /// This maps to the corresponding Console.ForegroundColor property.
        /// </summary>
        public override ConsoleColor ForegroundColor
        {
          get { return Console.ForegroundColor; }
          set { Console.ForegroundColor = value; }
        }
    
        /// <summary>
        /// Gets a value indicating whether a key is available. This maps to
        /// the corresponding Console.KeyAvailable property.
        /// </summary>
        public override bool KeyAvailable
        {
          get { return Console.KeyAvailable; }
        }
    
        /// <summary>
        /// Gets the maximum physical size of the window adapted from the
        /// Console.LargestWindowWidth and Console.LargestWindowHeight
        /// properties.
        /// </summary>
        public override Size MaxPhysicalWindowSize
        {
          get { return new Size(Console.LargestWindowWidth, Console.LargestWindowHeight); }
        }
    
        /// <summary>
        /// Gets the maximum window size adapted from the
        /// Console.LargestWindowWidth and console.LargestWindowHeight
        /// properties.
        /// </summary>
        public override Size MaxWindowSize
        {
          get { return new Size(Console.LargestWindowWidth, Console.LargestWindowHeight); }
        }
    
        /// <summary>
        /// Gets or sets the window position adapted from the Console window position
        /// members.
        /// </summary>
        public override Coordinates WindowPosition
        {
          get { return new Coordinates(Console.WindowLeft, Console.WindowTop); }
          set { Console.SetWindowPosition(value.X, value.Y); }
        }
    
        /// <summary>
        /// Gets or sets the window size adapted from the corresponding Console
        /// calls.
        /// </summary>
        public override Size WindowSize
        {
          get { return new Size(Console.WindowWidth, Console.WindowHeight); }
          set { Console.SetWindowSize(value.Width, value.Height); }
        }
    
        /// <summary>
        /// Gets or sets the title of the window mapped to the Console.Title
        /// property.
        /// </summary>
        public override string WindowTitle
        {
          get { return Console.Title; }
          set { Console.Title = value; }
        }
    
        /// <summary>
        /// This API resets the input buffer. In this example this
        /// functionality is not needed so the method returns nothing.
        /// </summary>
        public override void FlushInputBuffer()
        {
        }
    
        /// <summary>
        /// This API returns a rectangular region of the screen buffer. In
        /// this example this functionality is not needed so the method throws
        /// a NotImplementException exception.
        /// </summary>
        /// <param name="rectangle">Defines the size of the rectangle.</param>
        /// <returns>Throws a NotImplementedException exception.</returns>
        public override BufferCell[,] GetBufferContents(Rectangle rectangle)
        {
          throw new NotImplementedException(
                   "The method or operation is not implemented.");
        }
    
        /// <summary>
        /// This API Reads a pressed, released, or pressed and released keystroke
        /// from the keyboard device, blocking processing until a keystroke is
        /// typed that matches the specified keystroke options. In this example
        /// this functionality is not needed so the method throws a
        /// NotImplementException exception.
        /// </summary>
        /// <param name="options">Options, such as IncludeKeyDown,  used when
        /// reading the keyboard.</param>
        /// <returns>Throws a NotImplementedException exception.</returns>
        public override KeyInfo ReadKey(ReadKeyOptions options)
        {
          throw new NotImplementedException(
                    "The method or operation is not implemented.");
        }
    
        /// <summary>
        /// This API crops a region of the screen buffer. In this example
        /// this functionality is not needed so the method throws a
        /// NotImplementException exception.
        /// </summary>
        /// <param name="source">The region of the screen to be scrolled.</param>
        /// <param name="destination">The region of the screen to receive the
        /// source region contents.</param>
        /// <param name="clip">The region of the screen to include in the operation.</param>
        /// <param name="fill">The character and attributes to be used to fill all cell.</param>
        public override void ScrollBufferContents(Rectangle source, Coordinates destination, Rectangle clip, BufferCell fill)
        {
          throw new NotImplementedException(
                    "The method or operation is not implemented.");
        }
    
        /// <summary>
        /// This API copies an array of buffer cells into the screen buffer
        /// at a specified location. In this example this  functionality is
        /// not needed si the method  throws a NotImplementedException exception.
        /// </summary>
        /// <param name="origin">The parameter is not used.</param>
        /// <param name="contents">The parameter is not used.</param>
        public override void SetBufferContents(Coordinates origin, BufferCell[,] contents)
        {
          throw new NotImplementedException(
                    "The method or operation is not implemented.");
        }
    
        /// <summary>
        /// This API Copies a given character, foreground color, and background
        /// color to a region of the screen buffer. In this example this
        /// functionality is not needed so the method throws a
        /// NotImplementException exception./// </summary>
        /// <param name="rectangle">Defines the area to be filled. </param>
        /// <param name="fill">Defines the fill character.</param>
        public override void SetBufferContents(Rectangle rectangle, BufferCell fill)
        {
          throw new NotImplementedException(
                    "The method or operation is not implemented.");
        }
      }
    }
    

    参见

    系统.管理.自动化.主机.PSHost

    System.Management.Automation.Host.Pshost用户界面

    System.Management.Automation.Host.Pshostraw用户界面

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯