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 时杀死了进程。
所以我用 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 时杀死了进程。