2013-04-16 51 views
0

從一個正在運行的exe中,如何輕鬆地確定exe是否從powershell調用?我還沒有找到一個可靠的指標預定義的環境變量。確定powershell是否調用正在運行的exe文件?

我的具體問題是,我試圖通過創建一個「runner」.bat/.ps1修改env(一個Go靜態鏈接的EXE)現有PS會話中的PATH和其他env vars,當前正在運行的cmd.exe或PS的變量。如果從PS調用exe,我將創建一個.ps1。如果該exe文件是從cmd.exe調用的,我將創建一個.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

是你的問題如何確定exe是由powershell發起的,或者如何讓exe改變啓動它的powershell進程的環境? –

+0

我的目標是改變啓動exe的運行powershell實例的環境。我目前認爲我需要創建runner .bat或.ps1腳本來執行此操作,並且需要exe才能知道它是如何調用的,以創建跑步者腳本的正確「風格」。開放給所有的想法:) – Jon

回答

1

您可以使用WMI查找父進程ID,然後確定它是否爲PowerShell。我會在這裏顯示的例子在PowerShell中,但你需要將其轉換成相應的WMI API爲您的EXE:

$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檢查一些標記以告訴它修改它的env變量),否則它將不起作用。

+0

嗯,創建一個[簡單的例子](http://paste.ubuntu.com/5713692/)與一個.bat亞軍展示我想做的事情悲傷地從下拉出地毯這個。傳遞'/ c'或'/ k'並不重要,因爲所有事情都發生在一個子shell中。糟糕的假設......回到製圖板;) – Jon

相關問題