猿问

使用 AppID 在 WIndows 中启动应用程序并获取 pid

我正在尝试使用他们的 AppID 启动 Windows 应用程序,例如Microsoft.WindowsCalculator_8wekyb3d8bbwe!App我通过调用获得的Get-StartApps


目前我可以启动应用程序但无法获得正确的 PID


cmd = exec.Command("powershell", "start", `shell:AppsFolder\Microsoft.WindowsCalculator_8wekyb3d8bbwe!App`)

err := cmd.Start()

fmt.Println(cmd.Process.Pid)

这将返回 powershell 的 PID


C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe start shell:AppsFolder\Microsoft.WindowsCalculator_8wekyb3d8bbwe!App

有没有办法通过 AppID 启动应用程序并仍然获得正确的 PID?


慕斯709654
浏览 358回答 1
1回答

慕慕森

博士// Make PowerShell not only launch Calculator, but also// determine and output its PID, as described in the next section.out, _ :=         exec.Command(          `powershell.exe`,           `-NoProfile`,           `-Command`,           `Start-Process -ErrorAction Stop calculator: ; (Get-Process Calculator | Where-Object SessionId -eq (Get-Process -ID $PID).SessionId).ID`,        ).Output()// Parse stdout output, which contains the PID, into an intvar pid intfmt.Sscanf(string(out), "%d\n", &pid)原则上,您可以传递-PassThru给 PowerShell 的Start-Process( start) cmd,它返回一个 process-info 对象,该对象具有.Id包含已启动进程的 PID 的属性,并输出后者。不幸的是,对于特定的UWP/AppX 应用程序,例如计算器,这不起作用,这是底层 .NET API 中存在的问题,至少在 .NET 6.0 之前 - 请参阅GitHub 问题 #10996。您可以尝试以下解决方法:使用 启动 AppX 应用程序Start-Process,这会间接创建一个名为Calculator(Windows 10) / CalculatorApp(Windows 11) 的进程。如果您在启动计算器后运行,您可以自己识别此名称(Get-Process *calc*).Name。Get-Process *calc* | Select-Object Name, Path也会显示可执行文件路径,但请注意,此可执行文件应被视为实现细节,不能直接调用。Calculator返回那个/进程的 ID CalculatorApp。事实上,计算器只在给定的用户会话中创建一个这样的进程,这实际上使得识别该进程变得容易。请注意,这意味着可能会返回预先存在的计算器进程的 PID ,但这是正确的,因为通过简单地将新计算器窗口的创建委托给现有进程启动的瞬态进程。Start-Process如果您想识别新创建的窗口,则需要做更多的工作:您必须枚举进程的窗口并识别具有最高 z 顺序的窗口。PowerShell 代码(注意:在 Windows 11 中,替换Calculator为CalculatorApp):# Launch Calculator - which may reuse an existing instance and# merely create a new *window* - and report the PID.Start-Process -ErrorAction Stop calculator:(Get-Process Calculator | Where-Object SessionId -eq (Get-Process -ID $PID).SessionId).ID请注意,我使用 URL 方案calculator:作为启动计算器的更简单方法。笔记:防止Where-Object SessionId -eq (Get-Process -ID $PID).SessionId错误地考虑其他用户在他们自己的会话Calculator中创建的潜在进程(返回所有用户会话中在本地计算机上运行的所有进程)。按 过滤,即按活动用户会话(窗口站)过滤,可防止出现此问题。Get-Process.SessionID作为 PowerShell CLI调用:powershell.exe -NoProfile -Command "Start-Process -ErrorAction Stop calculator: ; (Get-Process Calculator | Where-Object SessionId -eq (Get-Process -ID $PID).SessionId).ID"
随时随地看视频慕课网APP

相关分类

Go
我要回答