有人能解释何时/为什么需要重新启动 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 项目内的文件
如果您的环境变量发生了变化(比如安装了修改 PATH 的东西),重新启动您的 shell 是最简单的修复方法 - 但如上所述,如果您知道做了什么更改,您可以解决这个问题并手动将其应用到您当前的 shell。
npm 模块位于文件系统上,因此除非它们修改了 PATH 或类似内容,否则您无需重新加载 shell 来查看更改。
如上所述,当您在编辑器中点击保存时,该数据将写入磁盘。当您执行 POSH/CMD 时,解释器会在运行时从磁盘读取该数据。
答案2
监听 WM_SETTINGCHANGE 窗口消息的进程将能够更新其当前环境变量而无需重新启动。
我认为忽略 Powershell 和 CMD 的 WM_SETTINGCHANGE 是为了确保在脚本执行期间环境变量不会被更改。
更多信息:
环境变量
重新启动 Windows 以刷新本地系统环境变量