仓库源文站点原文

关于环境变量的不完整总结

环境变量是什么

环境变量(environment variables)

在 Unix 系统通过初始化脚本启动时,环境变量通常会在此时被初始化,因此会被系统中的其它进程所继承。

在 Windows 系统中,环境变量存储在 Windows 注册表中。

在 cmd 里操作环境变量

  1. 查看全部环境变量
     set
    
  2. 设置环境变量
     set example=testvar
    
  3. 输出环境变量
     echo %path%
    
  4. 删除环境变量
     set example=
    
  5. 修改环境变量
  6. 给 path 添加新的路径
     set path=%path%;C:\Tools
    

cmd 里修改环境变量只影响当前的进程

在 powershell 里操作环境变量

PowerShell 提供了几种不同的方法来使用和管理环境变量

使用 variable 语法

  1. 查看全部环境变量
     ls Env:
    
  2. 设置环境变量
     $Env:example = "testvar"
    
  3. 输出环境变量
     echo $Env:example
    
  4. 删除环境变量
     del Env:example
    
  5. 修改环境变量
  6. 给 path 添加新的路径
     $Env:Path += ';C:\Tools'
    

cmdlet

  1. 查看全部环境变量
     Get-Item -Path Env:\*
    
  2. 设置环境变量
     New-Item -Path Env: -Name example -Value 'testvar'
     或
     Set-Item -Path Env:example -Value 'testvar'
    
  3. 输出环境变量
     Get-Item -Path Env:\example
     Get-Item -Path Env:\example | Select-Object -Property Value
     Get-Item -Path Env:\example | Select-Object -ExpandProperty Value
    
  4. 删除环境变量
     Remove-Item -Path Env:example
    
  5. 修改环境变量
     修改值
     Set-Item -Path Env:example -Value 'testvar2'
     重命名
     Rename-Item -Path Env:example -NewName example
    
  6. 给 path 添加新的路径
     Set-Item -Path Env:\Path -Value $Env:Path';C:\Tools'
     Set-Item -Path Env:\Path -Value ((Get-Item -Path Env:\Path | Select-Object -ExpandProperty Value)+';C:\Tools')
    

.NET 类

  1. 查看全部环境变量 ```
[Environment]::GetEnvironmentVariables()
```
  1. 设置环境变量
     [Environment]::SetEnvironmentVariable('example', 'testvar')
    
  2. 输出环境变量 ```
[Environment]::GetEnvironmentVariable('example')
```
  1. 删除环境变量
     [Environment]::SetEnvironmentVariable('example', '')
    
  2. 修改环境变量
  3. 给 path 添加新的路径
     [Environment]::SetEnvironmentVariable('path', [Environment]::GetEnvironmentVariable('path') + ';C:\Tools')
    

保存环境变量的修改

Environment 能修改全局的或当前用户的环境变量,其它两种方法在默认情况下都是修改当前进程的环境变量。修改全局的环境变量可能会遇到权限的问题。

[Environment]::SetEnvironmentVariable('example', 'testvar', [EnvironmentVariableTarget]::Process)
[Environment]::SetEnvironmentVariable('example', 'testvar', [EnvironmentVariableTarget]::User)
[Environment]::SetEnvironmentVariable('example', 'testvar', [EnvironmentVariableTarget]::Machine)
<!-- [EnvironmentVariableTarget].GetEnumNames() [EnvironmentVariableTarget].GetEnumValues() [EnvironmentVariableTarget].GetEnumName(0) [EnvironmentVariableTarget].GetEnumNames() | ForEach-Object { "{0,-10} {1}" -f $_,[int]([EnvironmentVariableTarget]::$_) } [EnvironmentVariableTarget]::Process [EnvironmentVariableTarget]::User [EnvironmentVariableTarget]::Machine -->

在 windows 修改环境变量最保险的方式还是通过这里修改

此电脑 -> 属性 -> 高级系统设置 -> 环境变量

使用 wmic 操作环境变量

  1. 查看全部环境变量

     wmic ENVIRONMENT
     wmic ENVIRONMENT where "username='<system>'"
    
  2. 设置环境变量

     wmic ENVIRONMENT create name="JAVA_HOME",username="<system>",VariableValue="%javaPath%"
    
  3. 输出环境变量

     wmic ENVIRONMENT where "name='Path' and username='<system>'"
    
  4. 删除环境变量

     wmic ENVIRONMENT where "name='JAVA_HOME' and username='<system>'" delete
    

使用 wmic 修改环境变量时要注意作用域,如果没有指定 username ,可能会把所有用户和系统全局的环境变量一起修改。

其实 windows 里还有很多奇技淫巧可以修改环境变量

在 bash 里操作环境变量

  1. 查看全部环境变量
     printenv
     或
     export -p
    
  2. 设置环境变量
     export example=testvar
    
  3. 输出环境变量
     echo $PATH
     或
     printenv PATH
    
  4. 删除环境变量
     export -n example
    
  5. 修改环境变量
  6. 给 path 添加新的路径
     export PATH=$PATH:/usr/local/nginx/sbin
    

保存环境变量的修改

在 c 语言里操作环境变量

c 里有一系列的函数来操作环境变量

char *getenv(const char *name);
int putenv(char *string);
int setenv(const char *envname, const char *envval, int overwrite);
int unsetenv(const char *name);
char *secure_getenv(const char *name);
int clearenv(void);

例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern char **environ;
int main(int argc, char* argv[], char* envp[])
{
    for (int i = 0; envp[i] != NULL; ++i)
    {
        printf("%s\n", envp[i]);
    }
    printf("****\n");

    for (char **var = environ; *var != NULL; ++var)
    {
        printf("%s\n", *var);
    }
    printf("****\n");

    printf("%s\n", getenv("PATH"));
    printf("****\n");

    putenv("TEST=123");
    printf("%s\n", getenv("TEST"));
    printf("****\n");

    int overwrite = 1;
    setenv("TEST", "321", overwrite);
    printf("%s\n", getenv("TEST"));
    printf("****\n");

    unsetenv("TEST");

    clearenv();

    return 0;
}

其它语言操作环境变量也会有相应的语法,只要看一下文档就好了。

查看某个进程的环境变量

参考

<!-- 查看全部 reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 查看单独的一个 reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path 当前用户 reg query "HKEY_CURRENT_USER\Environment" reg query "HKEY_CURRENT_USER\Environment" /v path reg query "HKEY_USERS\S-1-5-21-3803277148-3993583959-841945860-7304\Volatile Environment" /v path 这样也可以,但只能读取具体的值 (New-Object -ComObject WScript.Shell).RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path") RegDelete RegWrite 这样也可以 wmic ENVIRONMENT wmic ENVIRONMENT where "name='Path'" wmic ENVIRONMENT where "name='Path' and username='<system>'" wmic ENVIRONMENT where "name='Path' and username='<system>'" get UserName,Name,VariableValue wmic "select * from HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall" HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Get-Item New-Item Set-Item Copy-Item Move-Item Remove-Item 这样也可以 Get-WmiObject -Class Win32_ENVIRONMENT Get-WmiObject -Class Win32_ENVIRONMENT -Filter "Name = 'Path'" Get-WmiObject -Class Win32_ENVIRONMENT -Filter "Name = 'Path' and UserName = '<SYSTEM>'" Get-WmiObject -Query "select UserName, Name, VariableValue from Win32_ENVIRONMENT" Get-WmiObject -Query "select UserName, Name, VariableValue from Win32_ENVIRONMENT where Name = 'Path'" Get-WmiObject -Query "select UserName, Name, VariableValue from Win32_ENVIRONMENT where Name = 'Path' and UserName = '<SYSTEM>'" 这样也可以 Get-CimInstance -ClassName Win32_ENVIRONMENT Get-CimInstance -ClassName Win32_ENVIRONMENT -Filter "Name = 'Path'" Get-CimInstance -ClassName Win32_ENVIRONMENT -Filter "Name = 'Path' and UserName = '<SYSTEM>'" Get-CimInstance -Query "SELECT UserName, Name, VariableValue from Win32_ENVIRONMENT" Get-CimInstance -Query "SELECT UserName, Name, VariableValue from Win32_ENVIRONMENT WHERE name = 'Path'" Get-CimInstance -Query "select UserName, Name, VariableValue from Win32_ENVIRONMENT where Name = 'Path' and UserName = '<SYSTEM>'" Get-WmiObject -Class Win32_ENVIRONMENT -Filter "Name = 'Path' and UserName = '<SYSTEM>'" | Select-Object -ExpandProperty VariableValue Get-CimInstance -ClassName Win32_ENVIRONMENT -Filter "Name = 'Path' and UserName = '<SYSTEM>'" | Select-Object -ExpandProperty VariableValue Get-WmiObject -Query "select UserName, Name, VariableValue from Win32_ENVIRONMENT where Name = 'Path' and UserName = '<SYSTEM>'" | Select-Object -ExpandProperty VariableValue Get-CimInstance -Query "select UserName, Name, VariableValue from Win32_ENVIRONMENT where Name = 'Path' and UserName = '<SYSTEM>'" | Select-Object -ExpandProperty VariableValue 这两条也是可以的,但不能获取具体的值 Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" Get-Item -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 这条能获取单个值 (Get-Item -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment").GetValue('path') (Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment").path (Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment").DriverData -->