PowerShell 脚本备份所有环境变量并将其保存在文件中

问题描述 投票:0回答:2

我是 PowerShell 新手,最近开始学习它的一些命令。

现在我想尝试从环境路径变量(系统)中添加、编辑和删除任何路径条目。

但是我担心万一出现问题,所以我想备份所有环境变量,以备需要恢复时使用。

我有以下 cmdlet 可以在屏幕上显示特定变量,但是任何人都可以让我知道如何通过

.ps1
PowerShell 脚本将所有环境变量(系统和用户)备份到文本文件吗?

Get-ChildItem Env:Path
powershell command-line environment-variables backup command-prompt
2个回答
11
投票

注意: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 中报告。


-1
投票
您始终可以将输出发送到文件,方法是使用

Out-File cmdlet 将命令的输出“管道”(使用 | 完成)到文件

Get-ChildItem env: | Out-File test.txt

“test.txt”是您的文件名。

© www.soinside.com 2019 - 2024. All rights reserved.