确定powershell是否称为运行exe?

时间:2013-04-16 15:26:17

标签: powershell

从正在运行的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。

任何有创意,低复杂度的想法?

1 个答案:

答案 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),它才会起作用。