看看天空 发表于 2020-3-7 22:19

Windows 下环境变量详解

本帖最后由 看看天空 于 2020-3-10 21:40 编辑

# Windows 下环境变量详解

**一个环境变量肯定先是一个变量**



既然是一个变量,那么其值的改变就可以改变某个程序的运行结果,变量值可能会在执行期间被修改。变量可以通过不同的语法来设置,调用和清除。在计算机上则表现为**影响其运行进程的行为**。**每个应用程序都会引用环境变量**,如计算机登录时将主目录设置为一个环境变量。



Windows **普通权限**打开 `cmd` 或 `PowerSehll` 程序时,则会默认打开这样一个目录。`%USERPROFILE%`



Windows **管理员权限**打开`cmd` 或 `PowerSehll` 程序时,则会默认打开这样一个目录 `%SystemRoot%\system32`



因为计算机在查找**运行该进程的用户所拥有的目录结构**,并将其显示出来。不同权限的用户,在不同目录下打开的 `cmd` 或 `powershell` 进程时其目录结构肯定是不同的,所以显示的目录也就不同。Linux 或 Mac 下打开终端会显示 **HOME** 变量。



## 真环境变量



进程是由一个或多个线程执行的计算机程序的实例。它包含程序代码及其活动。根据操作系统的不同,一个线程可以由多个并发指令的执行线程组成。多个进程可能与同一程序相关联。例如,**打开同一个程序的多个实例通常会执行多个进程**。一个 Chrome (程序)用标签页或新窗口打开多个**网站**(多个实例)任务管理器中的**进程**会增加对应的数量。



每个**进程**都有一个环境块,其中包含一组环境变量的名称及其值。环境变量有两种类型:用户环境变量(为系统中的某个用户设置,其他用户无法使用)和系统环境变量(为所有用户设置,所有用户共享)当**应用程序初始化期间**,会访问到某个**进程**,并通过环境变量的名称可以将它们加载并访问。默认情况下,子进程继承其父进程的环境变量。如由命令处理器启动的程序将继承命令处理器的环境。



如在 `powershell` 中输入如下命令

```powershell
cd C:\Users
// 环境变量为 =C: 也就是当前驱动器,将其设置为 C:\Users
// 现在 win32 的目录设置为 C:\Users
D:
cd D:\Program Files
// 环境变量为 =D: 也就是当前驱动器,将其设置为 D:\Program Files
// 现在 win32 的目录设置为 D:\Program Files
C:
// 当前 win32 目录设置为 C:/Users
DIR
// 展示 C:/Users 下的文件目录结构

```

当我们重新切换为 C 盘时,相当于问命令处理程序,我们最后一次访问 C 盘的时候所保留的目录是什么?它会查看其环境并找到 `=A:` 变量,并得到当前驱动器的当前目录,也就是将 win32 目录设置为当前目录。这些变量的值被导出到环境中,因为我们希望子进程继承「每个伪造的驱动器的当前目录」



环境变量如 `Path` ,就是相当于一个指定的变量 `Path`在其调用过程的环境中有定义,如果有定义,则会显示这个变量的值。`Path`会查找你输入的命令和与命令相对应的程序。如果要**将某些应用程序保留在其主目录**的 **bin** 文件夹中,则**必须将该目录添加到** `Path` 中,以便于操作系统发出命令时可以在其中查找要运行的应用程序。



在 `PowerShell` 中,每个环境变量都由一个对象表示。环境变量的名称是 **字典键**,环境变量的值是 **字典值**。以下例子为 `PowerShell` 修改和显示 `Path`



```powershell
Get-Item Env:Path
$Env:Path
$Env:Path += ";C:\test"
Set-Item -Path Env:path -Value ($Env:Path + ";C:\test")
```



这里的更改仅在当前会话中有效,即**临时环境变量**(在一个新的 `cmd` 或者 `powershell` 中无效)类似 `cmd` 中的 `Set` 命令。永久更改需要将更改存储到注册表中,可在高级系统设置中将环境变量更改并应用。



## 伪环境变量



动态环境变量,是 `cmd` 启用命令行扩展时支持的伪环境变量,它们的值可以更改,但不会存储在环境中。



```
echo %DATE%
echo %TIME%
```





## 后记



其实为什么每次安装某些编程环境时你都需要手动设置环境变量 `Path`,因为你需要在命令解释程序如 `cmd` 或者 `powershell` 运行某个命令或程序,而这条命令或程序在当前环境中根本不存在。所以,会报如下错误。

```
"XXX" 不是内部或外部命令,也不是可运行的程序
或批处理文件。

XXX : 无法将“XXX”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确
```



如果我以前有仔细想过 NPM 设置一次软件包安装路径,所有的在其文件夹下的程序或命令就可以一直使用了的原因以及某些 NPM 软件包即使升级了,但也依然可以使用相同的命令,我可能会明悟的早一些吧。



所以,大部分情况下我们在 Windows 下关注环境变量究竟是干什么的,主要目的就是因为你懒得设置环境变量 Path,而命令解释程序直接抓瞎,满脑子黑人问号。「你说的这东西在哪呢?不在这儿啊?这疙瘩我都找完了,你换个目录吧,要不就是你没装这个软件,反正这锅我不背」

Coptis_china 发表于 2020-3-7 22:42

基础知识,收藏学习!

Conquest 发表于 2020-3-7 22:48

跟楼上说的一样,基础知识,但是真的很重要。感谢分享!

lapangxe 发表于 2020-3-7 22:51

基础知识,感谢分享!

Crazy开发仔 发表于 2020-3-7 22:59

一个java仔正好路过,回想刚学java的时候,
cmd → javac HelloWorld.java
提示 "javac" 不是内部或外部命令,也不是可运行的程序或批处理文件。

一头雾水,也是后来才明白,颇有感触。

wlc120 发表于 2020-3-7 23:03

基础知识,收藏学习!谢谢

BigGirl 发表于 2020-3-7 23:45

学习了,前几天安装软件费了大事儿
页: [1]
查看完整版本: Windows 下环境变量详解