本文也发布在笔者的个人站点
https://curious.host。
Windows很多预置的Path项中包含变量,形如:
%SystemRoot%\System32\Wbem
其中%SystemRoot%就代表一个系统内置变量(Path实际上也是这样的变量),程序或者我们读取这个Path时会自动将之展开成:
C:\WINDOWS\System32\Wbem
这是因为Path是以注册表值的形式存储在系统中的,而它的值类型是REG_EXPAND_SZ,即可展开字符串。这种自动展开的行为对于要使用Path的程序来说是正确的,或者说它的设计目标就是如此。
但对于小部分用法却会造成一定的副作用,比如,我们需要修改Path。在修改Path时我们首先需要读取Path,我们的预期目标是,读取出Path的字面值,然后加上或者去掉我们要修改的内容,再把它写回注册表。
然而,常规的读取方法,无论是注册表、.net类库还是PowerShell的内置方法,读取Path时返回的都不是字面值而是其中变量展开后的形式。这就造成一个后果:我们修改完Path再写回时,Path中原有条目的形式都被展开了,虽然实际效果没变,但这也是一种副作用。
作为一个强迫症,我不希望我的程序去改动用户原有的不相关配置。所以我一直在找解决方案,终于,还是PowerShell官方开源仓库论坛里的老哥提供了有效的方法,