0

実行中のexeから、exeがpowershellから呼び出されたかどうかを簡単に判断するにはどうすればよいですか? 信頼できるインジケーターである定義済みの環境変数が見つかりません。

私の特定の問題は、現在の環境変数を台無しにする「ランナー」.bat/.ps1 を作成することにより、既存の PS セッションの PATH およびその他の環境変数を exe (Go の静的にリンクされた exe) から変更しようとしていることです。 cmd.exe または PS を実行しています。exe が PS から呼び出された場合は、.ps1 を作成します。exe が cmd.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 セッションに伝播しません。exe のセットアップと呼び出しにラッパー .bat/.ps1 スクリプトを必要としないソリューションを探しています。

創造的で複雑性の低いアイデアはありますか?

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 を介して環境ブロックの変更を監視しない場合は、EXE 自体から助けが得られない限り機能しません (PowerShell でセンチネルをチェックして、環境変数を変更するように指示するなど)。

于 2013-04-16T16:13:57.693 に答える