为什么PowerShell ISE挂在这个C#程序上

本文关键字:程序上 PowerShell ISE 为什么 | 更新日期: 2023-09-27 18:10:08

如果我将这个c#代码编译成EXE文件并在Windows命令行中运行,它运行得很好:输出提示,在同一行等待一些用户输入,然后输入,并回显该输入。在PowerShell v3 shell中运行时,它也运行良好。然而,如果我在PowerShell ISE V3中运行这个相同的EXE文件,它将永远不会从Write发出输出,并且挂在ReadLine上。(顺便说一句,如果后面跟着WriteLine,它将从Write发出输出。(

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.Write("invisible prompt: ");
            var s = System.Console.ReadLine();
            System.Console.WriteLine("echo " + s);
        }
    }
}

这是ISE错误还是有一些属性需要调整以使其工作。。。?

为什么PowerShell ISE挂在这个C#程序上

ISE不支持console类。

  • 不支持[Console]类,请尝试[Console]::BackgroundColor="白色"。
    • 一般来说,脚本应该使用主机API的(write-host,而不是[Console]类,以便它们在控制台中工作,ISE、Remoting等炮弹

参考:http://blogs.msdn.com/b/powershell/archive/2009/04/17/differences-between-the-ise-and-powershell-console.aspx

作为一种解决方法,在powershell ise中,不调用.'ConsoleApplication1.exe而调用start .'ConsoleApplication1.exe这将在一个新的命令提示符中启动应用程序,该命令提示符将接受来自stdin的输入。

Powershell读取主机将从控制台读取。您可以从C#中执行读取主机。MSDN上关于Powershell托管的章节中介绍了从C#执行PS命令。下面演示了使用Powershell脚本的方法调用-应该很容易转换为C#。注意$host必须传递到C#程序中。因此,您必须将C#程序加载为ISE中的程序集,并调用Main((,如:[myclass]::Main($host((而不是将EXE作为独立程序调用(

[powershell]::create().AddScript('param($ho) $ho.ui.readline()').AddArgument($host).Invoke()