为什么使用 SetEnvironmentVariable 设置的用户变量在通过 cmd 窗口发送的 powershell 命令中不可见?

Why are User variables set with SetEnvironmentVariable not visible from powershell commands sent via cmd window?

当我在 powershell 窗口中运行这两个命令时,我得到 "Test Value." 打印出来。

[Environment]::SetEnvironmentVariable('TestVariable', 'Test value.')
[Environment]::GetEnvironmentVariable('TestVariable')

但是当我在 cmd 窗口中运行这两个命令时,我没有打印出任何内容。

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Command  {[Environment]::SetEnvironmentVariable('TestVariable', 'Test value.')}
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Command  [Environment]::GetEnvironmentVariable('TestVariable')

为什么我无法访问我在第二个示例中设置的变量?

我会说像这样混合两个炮弹是不好的形式。要么使用 PowerShell 或使用 cmd.exe。但是,如果您坚持这样做:

C:\> powershell "[environment]::setEnvironmentVariable('foo', 'bar', 'm')"
C:\> powershell "[environment]::getEnvironmentVariable('foo')"
bar

请注意,您也可以这样做

C:\> powershell "$env:foo"
bar

或者理智的选择

C:\> echo %foo%
bar

请注意,在识别变量之前,您可能需要重新启动 cmd.exe 环境。

Example

您看到此行为是因为每个进程都维护自己的环境(在从其父进程继承环境之后)。父进程(在本例中为 cmd.exe)看不到 powershell.exe 所做的更改,因为这些更改随 powershell 进程一起消失。