【问题标题】:How do I handle Windows PATH variable expansion when set from PowerShell?从 PowerShell 设置时如何处理 Windows PATH 变量扩展?
【发布时间】:2012-02-17 00:21:41
【问题描述】:

我正在 PowerShell 中调整几个 W2k3 服务器上的 PATH,以将某些带有空格的路径转换为它们的 8.3 等效路径。经过几次正则表达式转换后,我运行以下两个命令:

# Set the path for this process
$env:PATH = $path
# Set the path for the Machine
[System.Environment]::SetEnvironmentVariable('PATH', $path,[System.EnvironmentVariableTarget]::Machine) 

运行它们后,路径以我不希望的方式更改。 %SystemRoot% 统一扩展为 C:\Windows。我看不出这预示着世界末日在哪里,但我宁愿保留 %SystemRoot%,所以我一直在摆弄直到我让 %SystemRoot% 再次出现在路径中,但是当我这样做时,路径不再扩展并且不再作品。在 CLI 中回显路径会返回未扩展的字符串(这是错误的),并且无法再找到 SystemRoot 中的命令。

如果我随后在路径“;;”中添加一个空条目,而不更改 PATH 中的任何其他文本,它就会开始正常工作。

所以我的问题是如何使用 PowerShell 以编程方式更改路径,以免破坏路径中的变量扩展?

【问题讨论】:

  • 2 注释:1) 我确实为每个测试打开一个新的 CLI,2) 我从 $env:PATH 读取的路径已扩展,因此我正在读取 c:\windows 并手动更改%SystemRoot% 的值,然后将该值推回环境。
  • $path 设置为PATH 时有什么内容?
  • 每台服务器都不一样,但是 ...;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SystemRoot%\system32\WindowsPowerShell\v1.0;。 ..是所有这些的组成部分。当我读取 $path 时,它在读取过程中扩展为 c:\Windows。在设置它之前,我必须用它的等效变量 -ireplace 扩展值。除非我通过属性对话框手动触摸它,否则带有变量的 $path 值不会再次扩展。

标签: windows powershell environment-variables


【解决方案1】:

据我所知,您无法使用 [Environment]::SetEnvironmentVariable() 方法执行此操作,也无法使用 Registry 提供程序执行此操作。但是,您可以使用 Microsoft.Win32.RegistryKey 类访问注册表中的系统路径环境变量,如下所示:

C:\PS> $key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment', $true) C:\PS> $path = $key.GetValue('Path',$null,'DoNotExpandEnvironmentNames') C:\PS> $路径 ...;%systemroot%\System32\WindowsPowerShell\v1.0\ C:\PS> $key.SetValue('Path', $path + ';%Windir%\Symbols', 'ExpandString') C:\PS> $key.Dispose()

这将允许您保存更新的 PATH 并保留出现在 Path 值中的变量。

【讨论】:

  • 太棒了,基思。再次感谢您。
  • 仅供参考,脚本可能应该放在 try/finally 中,并在 finally 中对注册表项执行 Dispose。
  • 你知道,我差点问到这个问题,但由于我的脚本很短,而且每个变量都会立即消失,所以我并没有出汗。但既然你提出来了。 :-) .NET 4.0 包含您调用的手动 Dispose() 方法,但 2.0 没有。如果没有 Dispose() 方法,我应该如何处理密钥?
  • 在 .NET 2.0 中,使用 Close() 方法。
  • 你能扩展一下用户路径和系统路径吗?我假设您在此处显示的是系统路径而不是用户路径。
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2023-04-06
  • 2018-02-09
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多