PetSerAl предоставил критический указатель в комментарии:
Поскольку переменные окружения по своей природе [целые -] процесс -области , вам нужен внепроцессный пространство выполнения для получить желаемое поведение.
Напротив, PowerShell.Create()
сам по себе, без явного присвоения пространства выполнения через свойство .Runspace
результирующего экземпляра, по умолчанию используется внутрипроцессное пространство выполнения, и затем изменяется переменная среды через это пространство выполнения. неизменно влияет и на вызывающего абонента, работающего в том же процессе.
Чтобы изменить код для использования внепроцессного пространства выполнения, выполните следующие действия:
// ...
using System.Management.Automation.Runspaces;
// ...
// Create an out-of-process runspace...
using (var runspace = RunspaceFactory.CreateOutOfProcessRunspace(null))
{
runspace.Open(); // ... open it ...
using (PowerShell powerShell = PowerShell.Create())
{
powerShell.Runspace = runspace; // ... and assign it to the PowerShell instance.
// Now setting $env:PATH only takes effect for the separate process
// in which the runspace is hosted.
// Note: `powerShell.Runspace.SessionStateProxy.SetVariable("env:Path", ...)` does
// does NOT work with OUT-OF-PROCESS runspaces, so a call to
// `Set-Item env:PATH ...` is used to modify the other process' PATH env. var.
// (Environment.SetEnvironmentVariable() is NOT an option, because
// it would modify the *calling* process' environment).
powerShell.AddCommand("Set-Item")
.AddParameter("LiteralPath", "env:Path")
.AddParameter("Value", $"{searchTarget}{Path.PathSeparator}{Environment.GetEnvironmentVariable("Path")}")
.Invoke();
powerShell.Commands.Clear();
// ...
}
}
Примечание. Выше используется вызов Set-Item env:Path ...
для изменения $env:PATH
в пространстве выполнения вне процесса, поскольку, как указывает PetSerAl, в отличие от внутрипроцессных областей выполнения, использование powerShell.Runspace.SessionStateProxy.SetVariable("env:Path", ...)
создает переменную PowerShell с буквальным именем env:Path
вместо изменения среда переменная PATH
, начиная с Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview. 3; см. этот выпуск GitHub