我正在嘗試使用它們的 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?
uj5u.com熱心網友回復:
tl;博士
// 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 int
var pid int
fmt.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
。回傳該
Calculator
行程的 ID。Calculator 只在給定的用戶會話中創建一個這樣的行程這一事實實際上使識別該行程變得容易。請注意,這意味著可能會回傳先前存在的Calculator 行程的 PID,但這是正確的,因為由簡單地將新 Calculator 視窗的創建委托給現有行程啟動的瞬態行程。
Start-Process
如果您想識別新創建的window,則需要做更多的作業:您必須列舉行程的視窗并識別具有最高 z 順序的視窗。
PowerShell代碼:
# 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:
作為啟動 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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506906.html