Powershell 启动进程运行空间不会启动,除非使用 -noexit 标志

Powershell start-process Runspace wont start except with -noexit flag

所以我用 Runspaces 编写了这个小 GUI。 它在 ISE 中 运行 时按预期工作,如果我从 PS 提示符启动它,但是当我尝试从快捷方式 运行 它时,它不会启动只要我不使用 -noexit 标志。但是当使用 -noexit 标志时,即使在我关闭 GUI 后它也会离开 Powershell 进程 运行ning。

我正在为我的 GUI 使用此技术: Powershell GUI Template

这是我的快捷方式: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -sta -WindowStyle Hidden -file "C:\Temp\Runspaceversion.ps1"

那行不通...但如果我这样做了

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -sta -WindowStyle Hidden -noexit -file "C:\IT\Checklist\Runspaceversion.ps1"

它可以工作,但是当我退出 Gui 时我的 powershell 进程空转....

问题是默认情况下 PowerShell 控制台关闭,同时终止所有关联的运行空间和线程,包括它刚刚创建的表单之一。这是因为 BeginInvoke() 启动表单但随后恢复当前线程。

PowerShell 基本上必须是 运行。您可以尝试 RunDialog() 而不是 BeginInvoke(),它将保持主线程直到表单关闭,此时 PowerShell 也将退出。

正在使用的模板中没有退出代码。

当 Window 关闭时,将触发...

    #region Window Close 
    $syncHash.Window.Add_Closed({
        Write-Verbose 'Halt runspace cleanup job processing'
        $jobCleanup.Flag = $False

        #Stop all runspaces
        $jobCleanup.PowerShell.Dispose()

    })

更改该块以包含类似这样的内容...

    #region Window Close 
    $syncHash.Window.Add_Closed({
        Write-Verbose 'Halt runspace cleanup job processing'
        $jobCleanup.Flag = $False

        #Stop all runspaces
        $jobCleanup.PowerShell.Dispose()
        $jobProcessInfo = (Get-WmiObject win32_process `
        -Filter {name = 'powershell.exe' and commandline like '%PowerShell_GUI_Template.ps1%'})
        Stop-Process -Id $jobProcessInfo.ProcessId

    })

当然,这可能是一种蛮力的方式,但我拉下了模板,这适用于在关闭表单时关闭关联的主机进程 Window。

这是我的快捷方式。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -noexit "& { D:\Scripts\PowerShellTips\PowerShell_GUI_Template.ps1 }

我设法解决了这个问题,通过传递一个带有 $PID 的参数杀死了启动 GUI 的会话,并且正如帖子所说,在退出 GUI 时杀死了进程。