0

从正在运行的 exe 中,如何轻松确定该 exe 是否是从 powershell 调用的?我还没有找到作为可靠指标的预定义环境变量。

我的具体问题是,我试图通过创建一个破坏当前环境变量的“运行器”.bat/.ps1 从 exe(一个 Go 静态链接的 exe)修改现有 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')

但以上都没有将环境变量传播到现有的 PS 会话。我正在寻找一种不需要包装器 .bat/.ps1 脚本来设置和调用 exe 的解决方案。

有什么创造性的、低复杂性的想法吗?

4

1 回答 1

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') }"

启动的PowerShell EXE 并且不修改现有的 PowerShell 会话。事实上,修改现有 EXE 的 env 块会很棘手。如果 EXE 不通过 WM_SETTINGCHANGE 监控 env 块更改,除非您从 EXE 本身获得帮助(例如让 PowerShell 检查某些哨兵以告诉它修改其环境变量),否则它将无法工作。

于 2013-04-16T16:13:57.693 回答