从PowerShell设置时如何处理Windows PATH变量扩展?

cod*_*oke 6 windows powershell environment-variables

我在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) 
Run Code Online (Sandbox Code Playgroud)

运行它们之后,路径会以我不想要的方式改变.%SystemRoot%统一扩展为C:\ Windows.我无法看到这表示天启的意义,但我宁愿保留%SystemRoot%,所以我摆弄,直到我让%SystemRoot%再次出现在路径中,但是当我做的路径不再扩展而不再作品.在CLI处回显路径会返回未展开的字符串(这是错误的),并且无法再找到SystemRoot中的命令.

如果我然后在路径";;"中添加一个空条目,而不改变PATH中的任何其他文本,它开始正常工作.

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

Kei*_*ill 7

据我所知,您不能使用该[Environment]::SetEnvironmentVariable()方法执行此操作,并且您无法使用注册表提供程序执行此操作.但是,您可以使用Microsoft.Win32.RegistryKey类来访问注册表中的系统Path env var :

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> $path
...;%systemroot%\System32\WindowsPowerShell\v1.0\
C:\PS> $key.SetValue('Path', $path + ';%Windir%\Symbols', 'ExpandString')
C:\PS> $key.Dispose()

这将允许您保存更新的PATH并保留Path值中显示的变量.

  • 在.NET 2.0中,使用Close()方法. (2认同)