Windows - std.process - Setting env variables from D

wobbles via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Mar 30 10:07:31 PDT 2015


On Monday, 30 March 2015 at 14:14:50 UTC, Laeeth Isharc wrote:
> On Monday, 30 March 2015 at 13:29:06 UTC, wobbles wrote:
>> On Monday, 30 March 2015 at 12:54:28 UTC, Adam D. Ruppe wrote:
>>> On Monday, 30 March 2015 at 12:28:19 UTC, wobbles wrote:
>>>> Any solutions that people know of?
>>>
>>> You can't from an exe, it is a limitation of the operating 
>>> system (same on Linux btw, environment variable inheritance 
>>> is always from parent to child, never from child to parent). 
>>> The reason batch files can do it is that they don't run in a 
>>> separate process, they just run a batch of commands inside 
>>> the shell itself.
>>>
>>> https://msdn.microsoft.com/en-us/library/windows/desktop/ms682009%28v=vs.85%29.aspx
>>>
>>> "Altering the environment variables of a child process during 
>>> process creation is the only way one process can directly 
>>> change the environment variables of another process. A 
>>> process can never directly change the environment variables 
>>> of another process that is not a child of that process."
>>>
>>> If you're an administrator, you could poke the system-wide 
>>> variables in the registry and tell the processes to reload 
>>> them: 
>>> https://msdn.microsoft.com/en-us/library/windows/desktop/ms682653%28v=vs.85%29.aspx
>>>
>>> but of course, changing system-wide registry entries affects 
>>> way more than just your parent shell!
>>>
>>>
>>>
>>> If you need to change a parent shell variable, the only way 
>>> is to do it from a batch file. You could perhaps run a .bat 
>>> which sets the variable and calls your exe to help it do some 
>>> work.
>> Thanks Adam,
>>
>> Yeah, I knew it was the case in Linux, I just figured as 'set' 
>> worked in a batch file that it must be possible in Windows.
>>
>> I think what I'm going to do is have my D program output the 
>> commands as strings that are required to set the ENV variables 
>> in the parent and then have a batch file to run the program, 
>> get its output and run the commands outputted from the D 
>> program.
>> Can also have a bash file to do the same (using the source 
>> command).
>>
>> This is for setting up a build system we're using, and is 
>> normally run via Jenkins, so running it in a kind of ugly way 
>> doesnt really matter.
>>
>> We're currently maintaining two seperate scripts to do this 
>> work, I'm trying to consolidate them. Maintaining one 
>> large-ish D script to do this work and 2 mini scripts to call 
>> them should be easier to maintain than 2 large bash/batch 
>> scripts.
>>
>> Thanks!
>
> You tried setx, and it didn't work ?  Or you don't want to set 
> permanent environmental variables

Yep, correct. Don't want them to be permanent. The systems have
to be clean for other tests at all times, so they need to be on a
shell by shell basis sadly.


More information about the Digitalmars-d-learn mailing list