【发布时间】: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