2 回答

TA貢獻1946條經驗 獲得超3個贊
一般情況下,環境變量SHELL也不會告訴你什么shell調用你的腳本,它只是告訴你當前用戶的的二進制路徑默認外殼(在類Unix平臺),作為chepner筆記。
要檢測哪個 shell 調用了您的腳本,您必須檢查腳本的父進程。
以下適用于psutil安裝的軟件包(它與 v2 和 v3 兼容):
import os, psutil, re
# Get the parent process name.
pprocName = psutil.Process(os.getppid()).name()
# See if it is Windows PowerShell (powershell.exe) or PowerShell Core (pwsh[.exe]):
isPowerShell = bool(re.fullmatch('pwsh|pwsh.exe|powershell.exe', pprocName))
如果安裝包不是一個選項,您可以使用以下解決方法專門檢測 PowerShell,但請注意限制:
它假定標準PowerShell 安裝,特別是關于環境變量
PSModulePath
:也就是說,PSModulePath
必須:在 PowerShell 之外根本沒有預定義(類 Unix平臺)
或者必須具有只是一個或2項以外的PowerShell(視窗,通過注冊表預定義)[1] 。
它假定腳本不是通過嵌套的shell 調用來調用的:
如果您從 PowerShell 啟動了不同的 shell,然后該 shell 啟動了您的腳本,下面的解決方案仍會表明您的腳本是由 PowerShell 啟動的。
相反,如果您從 PowerShell啟動
wsl.exe
或 WSLbash.exe
或 MSYS'bash.exe
/sh.exe
,然后啟動您的腳本,下面的解決方案不會表明腳本是由 PowerShell(間接)啟動的,因為這些可執行文件不繼承調用者的環境變量;相比之下,Git附帶的bash.exe
/和 Cygwinsh.exe
附帶的/可以。
import os isPowerShell = len(os.getenv('PSModulePath', '').split(os.pathsep)) >= 3
請注意,當 PowerShell 啟動時,它確保所有平臺上的, 中至少存在3 個位置PSModulePath
(收件箱/系統模塊位置、所有用戶位置和當前用戶位置)。如前所述,在 PowerShell 之外,該變量在 Unix 上根本沒有預定義,而在 Windows 上,它最多預定義了 2 個位置。
[1] 較舊的 Windows 10 版本僅預定義了系統模塊位置$env:SystemRoot\System32\WindowsPowerShell\v1.0\Modules
,而較新的版本還預定義了所有用戶位置$env:ProgramFiles\WindowsPowerShell\Modules
。

TA貢獻1770條經驗 獲得超3個贊
如果您不想依賴外部包,建議的 PSModulePath 檢查在 Windows 上不能可靠地工作,它會為 cygwin、git bash 和 WSL 提供誤報。
但是,powershell 窗口和 cmd 窗口的共同點是它們都將環境變量PROMPT
設置為$P$G
(80 年代 DOS 的默認值)。因此以下作品
import os isCmdOrPowershell = (os.getenv('PROMPT', '') == '$P$G')
例如作為終端是否支持 ANSI 顏色的可靠測試(cmd 和 powershell 窗口:沒有。cygwin、git bash 和 WSL 窗口:是)。
添加回答
舉報