Winforms 是否在全GUI Powershell脚本中隐藏空控制台窗口?

Winforms 是否在全GUI Powershell脚本中隐藏空控制台窗口?,winforms,powershell,Winforms,Powershell,我用WinForms GUI制作了一个非常简单的Powershell脚本。 一切正常,但当我使用PowerShell运行.ps1脚本时,首先会出现一个黑色的空控制台窗口,然后GUI显示 要让控制台窗口消失吗 致以最良好的祝愿一年前我写了一封信(抱歉用法语) 下面是一个常见的解决方案,使用一个小的VBS脚本启动PowerShell隐藏窗口(技巧在最后一个,0) 我还将PowerShell嵌入了一个没有控制台调用的可执行文件中。我发现上面的方法对我不起作用。我用了这个: Set objShell =

我用WinForms GUI制作了一个非常简单的Powershell脚本。 一切正常,但当我使用PowerShell运行.ps1脚本时,首先会出现一个黑色的空控制台窗口,然后GUI显示

要让控制台窗口消失吗

致以最良好的祝愿一年前我写了一封信(抱歉用法语)

下面是一个常见的解决方案,使用一个小的VBS脚本启动PowerShell隐藏窗口(技巧在最后一个,0


我还将PowerShell嵌入了一个没有控制台调用的可执行文件中。

我发现上面的方法对我不起作用。我用了这个:

Set objShell = CreateObject("WScript.Shell")

objShell.Run "CMD /C START /B " & objShell.ExpandEnvironmentStrings("%SystemRoot%") & "\System32\WindowsPowerShell\v1.0\powershell.exe -file " & "YourScript.ps1", 0, False

Set objShell = Nothing

希望这能有所帮助。

我就是这样做到的:

  • 将Winforms GUI脚本放在一个ScriptOne.ps1文件中
  • 创建另一个包含以下内容的LaunchScriptOne.ps1文件:
  • powershell.exe-WindowStyle Hidden-文件“C:\path\to\ScriptOne.ps1”

    解决方案是在同一主题的另一个线程中提供的:


    我希望有人能找到一种方法,把它变成一个单一的脚本以及。上面这个帖子中的答案对我没有帮助,但可能是我做错了什么,idk。

    这个解决方案在启动后最小化了Powershell窗口。Powershell窗口将打开,然后取消显示,而不使用任何外部代码。把它放在脚本的开头

    $t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
    add-type -name win -member $t -namespace native
    [native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)
    

    我是nube所以没有代表所以不能评论内联。。。虽然我非常喜欢wrt@Ipse的解决方案,但我也确保在脚本完成时关闭隐藏窗口。。。不确定PS是否会进行这种自动垃圾收集,但怀疑这是一种良好的最佳实践

    在你剧本的结尾,我建议你:

    停止进程-Id$PID


    (这将终止隐藏的窗口v。只需让它潜伏在周围并占用这些资源即可)。

    如何启动脚本?还有:您希望窗口在某个时候消失(非常容易做到)还是根本不出现(从来没有必要找到方法,老实说,不知道它是否存在).我假设你是在重复PS1脚本。对吗?另外,示例代码将真正有助于给出准确的答案。请注意,如果希望稍后再次显示窗口,则需要在窗口仍然可见时保存其句柄。因此,我在脚本的早期只做了一次
    $hWindow=(Get Process-id$pid).MainWindowHandle
    (同时,缩短代码以获取当前进程)并将该变量作为第一个
    ShowWindow
    参数传递。
    $t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
    add-type -name win -member $t -namespace native
    [native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)