什么时候必须重新启动 Powershell 或 cmd 提示符才能访问最新的机器状态?

什么时候必须重新启动 Powershell 或 cmd 提示符才能访问最新的机器状态?

有人能解释何时/为什么需要重新启动 Powershell 和/或 cmd 提示符(如果它们对这个问题的行为不同)吗?

例如,为了使用最新的机器状态,我必须在之后重新启动 Powershell:

1)编辑系统环境变量,如Path

2)安装 npm 模块等

3)编辑 .txt 文件或 VSCode 项目内的文件

提前致谢!

答案1

通常,只有在环境发生变化时才需要重新加载 shell - 通常这样做快速、简单,而且基本上可以保证工作。但这可能很烦人,而且根据你正在做的事情,这不是绝对必要的。

CMD 和 Powershell 都会在启动时读取用户/系统环境变量并将其应用于当前 shell。当您在此 shell 中更改 PATH 等值时,您只会更新任何新 shell(CMD 或 POSH)使用的默认值,并且通常不会更改当前 shell 环境。

PATH 之类的东西可以在当前 shell 中更改,但在 CMD 和 POSH 中操作方式不同。下面是一个简单的演示,展示了使用命令提示符进行的操作。

打开 CMD 提示符,并运行以下命令来设置演示:

C:\>mkdir c:\pathtest
C:\>echo @echo hello > c:\pathtest\sayhello.cmd

如果你切换到 c:\pathtest 并执行sayhello,它应该按预期工作并在屏幕上打印“hello”:

C:\>cd c:\pathtest
C:\pathtest>sayhello
hello

现在,将目录改回根目录并sayhello再次运行,您会收到命令无法识别的错误:

C:\pathtest>cd ..
C:\>sayhello
'sayhello' is not recognized as an internal or external command,
operable program or batch file.

现在,魔术来了,下面的更新将您当前 shell 的 PATH(仅)更新为包含,并允许您从任何地方c:\pathtest运行。sayhello

C:\>SET PATH=%PATH%;c:\pathtest
C:\>sayhello
hello

关闭 CMD 提示符,然后打开一个新的提示符,PATH 语句已恢复为其原始值并且sayhello不再起作用。(您c:\pathtest现在也可以删除)。

这同样适用于 Powershell - 您可以操作内置的 $env 变量来改变当前会话的 PATH 等。

那么,回到你最初的问题:

例如,为了使用最新的机器状态,我必须在之后重新启动 Powershell:

1)编辑系统环境变量,如Path

2)安装 npm 模块等

3)编辑 .txt 文件或 VSCode 项目内的文件

  1. 如果您的环境变量发生了变化(比如安装了修改 PATH 的东西),重新启动您的 shell 是最简单的修复方法 - 但如上所述,如果您知道做了什么更改,您可以解决这个问题并手动将其应用到您当前的 shell。

  2. npm 模块位于文件系统上,因此除非它们修改了 PATH 或类似内容,否则您无需重新加载 shell 来查看更改。

  3. 如上所述,当您在编辑器中点击保存时,该数据将写入磁盘。当您执行 POSH/CMD 时,解释器会在运行时从磁盘读取该数据。

答案2

监听 WM_SETTINGCHANGE 窗口消息的进程将能够更新其当前环境变量而无需重新启动。

我认为忽略 Powershell 和 CMD 的 WM_SETTINGCHANGE 是为了确保在脚本执行期间环境变量不会被更改。

更多信息:
环境变量
重新启动 Windows 以刷新本地系统环境变量

相关内容