从正在运行的exe中,如何轻松确定是否从PowerShell调用了exe?我没有找到一个可靠指标的预定义环境变量。
我的具体问题是我正在尝试通过创建一个“转轮”.bat / .ps1来修改现有的PS会话中的PATH和其他环境变量,从而破坏环境变量当前运行的cmd.exe或PS。如果从PS调用exe,我将创建一个.ps1。如果从cmd.exe调用exe,我将创建一个.bat。理想情况下,我会使用类似以下内容的.bat来处理PS:
rem This doesn't work
powershell -C "& { $env:FAKE_PATH_2='C:\ruby193\bin' }"
rem This also doesn't work
powershell -C "& { [Environment]::SetEnvironmentVariable('FAKE_PATH_3', 'Sneaky 1') }"
rem This also doesn't work
powershell -C [Environment]::SetEnvironmentVariable('FAKE_PATH_4', 'Sneaky 2')
但以上都没有将env变量传播到现有的PS会话。我正在寻找一种解决方案,它不需要包装.bat / .ps1脚本来设置和调用exe。
任何有创意,低复杂度的想法?
答案 0 :(得分:1)
您可以使用WMI查找父进程ID,然后确定它是否为PowerShell。我将在PowerShell中显示一个示例,但您需要将其转换为EXE的相应WMI API:
$parentPid= (Get-WmiObject -Class Win32_Process -Filter "ProcessId='$pid'").ParentProcessId
(Get-Process -Id $parentPid).ProcessName
那就是说,问题的其余部分对我来说不是很清楚。执行此:
powershell -C "& { [Environment]::SetEnvironmentVariable('FAKE_PATH_3', 'Sneaky 1') }"
启动 new PowerShell EXE,但不修改现有的PowerShell会话。实际上,修改现有的EXE的env块会很棘手。如果EXE不通过WM_SETTINGCHANGE监视env块更改,除非你从EXE本身获得帮助(比如让PowerShell检查一些哨兵告诉它修改它的env vars),它才会起作用。