1 回答

TA貢獻1856條經驗 獲得超17個贊
博士
// 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
(Windows 10) /CalculatorApp
(Windows 11) 的進程。如果您在啟動計算器后運行,您可以自己識別此名稱
(Get-Process *calc*).Name
。Get-Process *calc* | Select-Object Name, Path
也會顯示可執行文件路徑,但請注意,此可執行文件應被視為實現細節,不能直接調用。Calculator
返回那個/進程的 IDCalculatorApp
。事實上,計算器只在給定的用戶會話中創建一個這樣的進程,這實際上使得識別該進程變得容易。請注意,這意味著可能會返回預先存在的計算器進程的 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"
- 1 回答
- 0 關注
- 336 瀏覽
添加回答
舉報