簡體   English   中英

如何在PowerShell中更改環境變量並啟動應用程序

[英]How to change a environment variable in PowerShell and launch an application

在PowerShell中,我需要更改系統路徑變量:

$oldPath = [System.Environment]::GetEnvironmentVariable('Path', 'Machine')
[System.Environment]::SetEnvironmentVariable('Path', (Transform-It $oldPath), 'Machine')

然后啟動一個程序:

& $someExeName 'someargument'

我得到的問題是可執行文件正在使用舊環境。 它無法識別新路徑。 如果我還更改$env.path ,要僅更改此PowerShell會話的路徑,它也不會傳播到新進程。 如果我關閉PowerShell並在新窗口中啟動可執行文件,那很好。 據推測,它繼承了PowerShell流程中的(未更新的)環境。

在PowerShell中更改環境變量並通過從該窗口啟動的新進程識別它的最佳實踐是什么?

通常,子進程從父進程*繼承環境。 如果從現有PowerShell會話生成新的PowerShell會話,則新會話將從該會話繼承環境變量(但不包含其他變量)。

但是, Path變量是一個異常,會引起很多混淆:即使它是一個環境變量,新的PowerShell會話也會從注冊表項HKLM:\\System\\CurrentControlSet\\Control\\Session Manager\\Environment讀取其值,從而覆蓋繼承的值來自父會話。

  • 此行為特定於Path變量。 其他環境變量從父會話繼承,無論它們是僅在父會話中定義還是存儲在上述注冊表項中。

  • 此行為也特定於PowerShell。

    »如果在PowerShell會話中更改路徑但不在注冊表中更改路徑 ,並生成新的PowerShell會話(例如,使用start powershell ),則新會話將具有來自注冊表的路徑,但是如果您生成cmd會話,則新的會話將具有產生它的PowerShell會話的路徑。

    »同樣,如果在cmd會話中更改路徑 (使用set Path=New Path )並生成PowerShell會話,則新會話將具有來自注冊表的路徑,但是如果您生成cmd會話,則它將具有更改的路徑來自父cmd會話。

    »默認行為是從父進程繼承路徑(以及環境的其余部分)(如cmd所示)。 但是,很有可能其他一些程序的行為與PowerShell類似,用注冊表值覆蓋繼承的值 這種行為並不常見,但不能排除可執行文件發生這種情況的可能性。

以下命令更改當前會話中的路徑 ,而不是在注冊表中:

$env:Path = 'New path'

[System.Environment]::SetEnvironmentVariable('Path', 'New Path', 'Process')


以下命令更改注冊表中的Path ,而不是當前會話中的路徑

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' -Name 'Path' -Value 'New Path'

[System.Environment]::SetEnvironmentVariable('Path', 'New Path', 'Machine')

您所描述的內容對我沒有意義,因為您說您已經嘗試過一種方法來更改注冊表中的路徑,一種更改PowerShell會話中的路徑,以及您正在生成的可執行文件兩種方式都沒有改變的路徑。 AFAIK原始環境不會緩存在任何地方,子進程必須從父進程的環境或注冊表獲取路徑。

我建議您確保在啟動可執行文件之前已經雙向改變了路徑:

  1. 打開PowerShell會話
  2. 使用在會話中更改路徑的方法之一更改路徑
  3. 使用在注冊表中更改它的方法之一更改路徑
  4. 啟動可執行文件

如果由於某些無法解釋的原因不起作用,請嘗試以下方法:

  1. 打開PowerShell會話
  2. 使用在注冊表中更改它的方法之一更改路徑
  3. 不是直接從該PowerShell會話啟動可執行文件,而是執行此命令

     powershell "& $someExeName 'someargument'" 

    使用可從注冊表中讀取Path環境變量的新但非交互式PowerShell會話啟動可執行文件。


relationship between parent and child processes in Windows. *請注意,環境的繼承是Windows中父進程和子進程之間的關系。 除此之外,它們完全獨立(沒有像Unix和Linux那樣的層次結構)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM