1 回答

TA貢獻(xiàn)1856條經(jīng)驗 獲得超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
包含已啟動進(jìn)程的 PID 的屬性,并輸出后者。不幸的是,對于特定的UWP/AppX 應(yīng)用程序,例如計算器,這不起作用,這是底層 .NET API 中存在的問題,至少在 .NET 6.0 之前 - 請參閱GitHub 問題 #10996。
您可以嘗試以下解決方法:
使用 啟動 AppX 應(yīng)用程序
Start-Process
,這會間接創(chuàng)建一個名為Calculator
(Windows 10) /CalculatorApp
(Windows 11) 的進(jìn)程。如果您在啟動計算器后運行,您可以自己識別此名稱
(Get-Process *calc*).Name
。Get-Process *calc* | Select-Object Name, Path
也會顯示可執(zhí)行文件路徑,但請注意,此可執(zhí)行文件應(yīng)被視為實現(xiàn)細(xì)節(jié),不能直接調(diào)用。Calculator
返回那個/進(jìn)程的 IDCalculatorApp
。事實上,計算器只在給定的用戶會話中創(chuàng)建一個這樣的進(jìn)程,這實際上使得識別該進(jìn)程變得容易。請注意,這意味著可能會返回預(yù)先存在的計算器進(jìn)程的 PID ,但這是正確的,因為通過簡單地將新計算器窗口的創(chuàng)建委托給現(xiàn)有進(jìn)程啟動的瞬態(tài)進(jìn)程。
Start-Process
如果您想識別新創(chuàng)建的窗口,則需要做更多的工作:您必須枚舉進(jìn)程的窗口并識別具有最高 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
中創(chuàng)建的潛在進(jìn)程(返回所有用戶會話中在本地計算機(jī)上運行的所有進(jìn)程)。按 過濾,即按活動用戶會話(窗口站)過濾,可防止出現(xiàn)此問題。Get-Process
.SessionID
作為 PowerShell CLI調(diào)用:
powershell.exe -NoProfile -Command "Start-Process -ErrorAction Stop calculator: ; (Get-Process Calculator | Where-Object SessionId -eq (Get-Process -ID $PID).SessionId).ID"
- 1 回答
- 0 關(guān)注
- 327 瀏覽
添加回答
舉報