我是 PowerShell 新手,最近开始学习它的一些命令。
现在我想尝试从环境路径变量(系统)中添加、编辑和删除任何路径条目。
但是我担心万一出现问题,所以我想备份所有环境变量,以备需要恢复时使用。
我有以下 cmdlet 可以在屏幕上显示特定变量,但是任何人都可以让我知道如何通过
.ps1
PowerShell 脚本将所有环境变量(系统和用户)备份到文本文件吗?
Get-ChildItem Env:Path
注意:PowerShell的
env:
驱动仅反映当前进程的环境变量 - 要持久更改系统或当前用户的环境变量,您必须直接使用.NET框架 - 请参阅此答案 .
以下代码片段使用了
env:
,因此仅显示如何保存和恢复当前进程的所有环境变量:
# 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
。因此,如果
Set-Item
通过管道接收具有属性的名称(
.PSPath
,
.Value
)的对象,它们应该自动绑定到
-PSPath
(
-LiteralPath
)和
-Value
参数,启用诸如
... | Set-Item
之类的调用 - 因此should 不需要通过
%
(
ForEach-Object
) 进行显式枚举和显式参数传递,如上面所使用的。但是不幸的是,从 Windows PowerShell v5.1 / PowerShell Core v6.0.1 开始,
-Value
参数的定义方式是also 将输入对象 作为一个整体 绑定到
-Value
(
ValueFromPipeline
) ),鉴于
-Value
一般定义为类型
[System.Object]
-invariously 优先于查找对象的
.Value
property (
ValueFromPipelineByPropertyName
) - 换句话说:没有输入对象,无论其类型,始终受其
.Value
属性约束 - 任何输入对象都被作为其自身 绑定。 在本例中,
Import-CliXml
输出的对象属于类型
[Deserialized.System.Collections.DictionaryEntry]
;它们绑定到
-Value
,然后在设置环境变量时转换为string(环境变量只能包含 string 值);该类型的字符串表示形式是
System.Collections.DictionaryEntry
- 无论其
.Value
属性如何 - 因此,该通用字符串 - 无用 - 设置为环境变量的值。此问题行为已在
GitHub 问题 #5543 中报告。
Out-File cmdlet: 将命令的输出“管道”(使用 | 完成)到文件
Get-ChildItem env: | Out-File test.txt
“test.txt”是您的文件名。