【问题标题】:Why does PowerShell ISE hang on this C# program?为什么 PowerShell ISE 会挂在这个 C# 程序上?
【发布时间】:2013-04-19 21:11:27
【问题描述】:

如果我将此 c# 代码编译为 EXE 文件并在 Windows 命令 shell 中运行,它运行良好:输出提示,在同一行等待某些用户输入,然后输入,回显该输入。在 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 中它有时称为 Keyboard Polling 可以实现某些问题。因此,当由于 Powershell 使用该轮询而调用 Console.ReadLine() 时,可能会导致冲突。

标签: c# powershell freeze powershell-ise


【解决方案1】:

ISE 不支持console 类。

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

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

【讨论】:

  • 安迪:你让我意识到我应该问的问题取决于答案:是否有解决方法/设置/等。那么这个问题会很好,但既然你指出有 not 那么更好的问题应该是这样的:是否有某种方法可以在不使用的情况下从 ISE 读取 C# 中的输入控制台? 但我事先并不知道。不管怎样,你按要求回答了,所以你得到了复选标记——谢谢!
【解决方案2】:

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

【讨论】:

  • +1 这是一个方便的解决方法——感谢您的建议!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多