有Powershell ConsoleShell.Start的问题

时间:2010-07-28 13:17:59

标签: vb.net powershell powershell-v2.0

运行以下代码导致HostException;

  Public Sub RunPowershellInConsole(ByVal scriptText As String)
    Dim config = RunspaceConfiguration.Create
    Dim args() As String = New String() {scriptText}

    ConsoleShell.Start(config, "Windows PowerShell", "", args)
  End Sub

System.Management.Automation.Host.HostException was unhandled
  Message=The Win32 internal error "The handle is invalid" 0x6 occurred when retrieving handle for active console output buffer. Contact Microsoft Support Services.
  Source=Microsoft.PowerShell.ConsoleHost
  WasThrownFromThrowStatement=False
  StackTrace:
       at Microsoft.PowerShell.ConsoleControl.GetActiveScreenBufferHandle()
       at Microsoft.PowerShell.ConsoleHostRawUserInterface.GetBufferInfo(CONSOLE_SCREEN_BUFFER_INFO& bufferInfo)
       at Microsoft.PowerShell.ConsoleHostRawUserInterface.get_ForegroundColor()
       at Microsoft.PowerShell.ConsoleHostRawUserInterface..ctor(ConsoleHostUserInterface mshConsole)
       at Microsoft.PowerShell.ConsoleHostUserInterface..ctor(ConsoleHost parent)
       at Microsoft.PowerShell.ConsoleHost..ctor(RunspaceConfiguration configuration)
       at Microsoft.PowerShell.ConsoleHost.CreateSingletonInstance(RunspaceConfiguration configuration)
       at Microsoft.PowerShell.ConsoleHost.Start(RunspaceConfiguration configuration, String bannerText, String helpText, String preStartWarning, String[] args)
       at Microsoft.PowerShell.ConsoleShell.Start(RunspaceConfiguration configuration, String bannerText, String helpText, String preStartWarning, String[] args)
       at Microsoft.PowerShell.ConsoleShell.Start(RunspaceConfiguration configuration, String bannerText, String helpText, String[] args)
       at MyApp.Barry.Bosely.RunPowershell.RunPowershellInConsole(String scriptText) in C:\Dev\MiscProjects\GordonB\Barry\Barry.Bosely\RunPowershell.vb:line 87
       at MyApp.Barry.Bosely.frmMain.TEstToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Dev\MiscProjects\GordonB\Barry\Barry.Bosely\frmMain.vb:line 119
       at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ToolStrip.WndProc(Message& m)
       at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at MyApp.Barry.Bosely.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.ComponentModel.Win32Exception
       ErrorCode=-2147467259
       Message=The handle is invalid
       NativeErrorCode=6
       InnerException: 

对任何人都没什么帮助?

1 个答案:

答案 0 :(得分:1)

我刚刚在我的控制台应用程序中尝试了这段代码,但它确实有效:

using System.Management.Automation.Runspaces;
using Microsoft.PowerShell;

namespace TryConsoleShell
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = RunspaceConfiguration.Create();
            ConsoleShell.Start(config, "Windows PowerShell", "help text", new string[] { "-noexit", "ls" });
        }
    }
}

我猜您的应用程序是 Windows应用程序,并且根本不支持此方案,或者您仍然需要一个控制台窗口(我还没有尝试过这种方式)。

编辑:

它也适用于WinForm应用程序。但是控制台主机仍然需要控制台窗口。要使控制台窗口可用,只需将项目输出类型更改为控制台应用程序

using System;
using System.Management.Automation.Runspaces;
using System.Windows.Forms;
using Microsoft.PowerShell;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var config = RunspaceConfiguration.Create();
            ConsoleShell.Start(config, "Windows PowerShell", "help text", new string[] { "-noexit", "ls" });
        }
    }
}

P.S。我在实践中从未见过这种情况的使用,甚至不知道它确实有效。它有一些实用的应用吗?