views:

44

answers:

1

Running the following code resulting in an 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: 

Little help anyone?

+1  A: 

I have just tried this code in my Console Application and it worked:

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" });
        }
    }
}

I guess your application is Windows Application and this scenario is either not supported at all or you still have to have a console window available (I have not tried this way yet).

EDIT:

It worked in WinForm Application as well. But the console window is still needed for the console host. To make the console window available just change the project output type to Console Application.

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. I have never seen use of this scenario in practice and did not even know that it actually works. Are there some practically useful applications of it?

Roman Kuzmin
I hope so, but i need to see how the shell window handles scripts like set-executionPolicy unrestricted
GordonB
If it's all about `Set-ExecutionPolicy` only then you can just avoid interaction by using the `-Force` switch: `Set-ExecutionPolicy RemoteSigned -Force`.
Roman Kuzmin
it's not all about that... we have other scripts where the user will want to see the output.... Cheers for the remote-signed -force. +1 ;)
GordonB