注:
PowerShell的
env:
驱动器仅反映当前的环境变量
过程
-至
坚持不懈地
更改系统或当前用户的环境变量时,必须使用。NET framework-请参阅
this answer
我的。
以下代码段使用
环境:
,因此仅显示如何
保存并还原当前
过程
:
# Save all the process' environment variables in CLIXML format.
Get-ChildItem env: | Export-CliXml ./env-vars.clixml
# ... modify the env. variables
# Restore the previously saved env. variables.
Import-CliXml ./env-vars.clixml | % { Set-Item "env:$($_.Name)" $_.Value }
注意,这将
不
删除任何
新
环境。然而,您可能同时创建了变量-需要额外的工作来消除这些变量。
注:
Export-CliXml
和
Import-CliXml
正在使用,因为
启用稳健的值往返(序列化/反序列化)
(尽管你不能
通常地
重新创建完全相同的对象
类型
,仅反序列化
日的替身
).
相比之下,使用类似
Get-ChildItem env: > ./env-vars.txt
或其等效物,
Get-ChildItem env: | Out-File ./env-vars.txt
只需保存
Get-ChildItem
输出为
纯文本
它在控制台中的显示方式
,该格式不适合
机器解析
(反序列化)。
可选阅读:为什么
Import-CliXml ./env-vars.clixml | Set-Item
应该
工作,但不:
Set-Item
旨在通过管道绑定参数值,尤其是
-LiteralPath
(别名
-PSPath
)和
-Value
.
设置项目
通过管道接收具有
属性
用那些名字(
.PSPath
,
.Value
),他们
应该
-PSPath
(
-文字路径
)和
-价值
参数,启用调用,例如
... | Set-Item
-就这样
应该
不需要显式枚举和显式参数传递
%
(
ForEach-Object
),如上所述。
然而,不幸的是,从Windows PowerShell v5.1/PowerShell Core v6.0.1开始
-价值
参数的定义方式如下:
而且
绑定输入对象
作为一个整体
到
-价值
(
ValueFromPipeline
),鉴于此
-价值
一般定义为类型
[System.Object]
-
一成不变
优先于查找对象的
.价值
所有物
(
ValueFromPipelineByPropertyName
)-换句话说:
任何输入对象,无论其类型如何,都不会受到其
.价值
属性-绑定任何输入对象
就像它自己一样
.
在本例中,通过
导入CliXml
属于类型
[Deserialized.System.Collections.DictionaryEntry]
; 他们一定会
-价值
,然后转换为
设置环境变量时(环境变量只能包含
一串
价值观);该类型的字符串表示为
System.Collections.DictionaryEntry
-无论其
.价值
属性,因此该泛型字符串被无用地设置为环境变量的值。
这种有问题的行为
reported on GitHub
.