用于备份所有环境变量并将其保存在文件中的 PowerShell 脚本
PowerShell script to take backup of all environment variables & save it in a file
我是 PowerShell 的新手,最近开始学习它的一些命令。
现在我想尝试添加、编辑和删除环境路径变量(系统)中的任何路径条目。
但我担心万一出问题,所以我想备份所有环境变量以备不时之需。
我有以下 cmdlet 可以在屏幕上显示特定变量,但是谁能告诉我如何通过 .ps1
PowerShell 将所有环境变量(系统和用户)备份到文本文件脚本?
Get-ChildItem Env:Path
您始终可以将输出发送到文件,通过 "piping"(使用 | 完成)将命令的输出发送到具有 Out-File cmdlet:
的文件
Get-ChildItem env: | Out-File test.txt
"test.txt" 是您的文件名。
注意:PowerShell的env:
驱动只反映了当前进程的环境变量-至坚持改变系统或当前用户的环境变量,你必须直接使用.NET框架 - 见我的。
以下代码片段使用了 env:
,因此仅展示了如何 保存和恢复当前 进程[=100 的所有环境变量=]:
# 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 }
请注意,这 不会 删除任何 new 环境。您可能在此期间创建了变量,但是 - 需要额外的工作来消除这些变量。
注意:Export-CliXml
和 Import-CliXml
被使用,因为它们 启用健壮的往返(序列化/反序列化) values(虽然你不能通常重新创建完全相同的type的对象,只能反序列化look-alikes).
相比之下,使用 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
等调用 - 所以应该不需要通过%
(ForEach-Object
)显式枚举和显式参数传递,如上所用。
不幸的是,从 Windows PowerShell v5.1 / PowerShell Core v6.0.1 开始,-Value
参数的定义方式 also 将输入对象 作为一个整体 绑定到 -Value
(ValueFromPipeline
),这 - 假设 -Value
通常定义为类型 [System.Object]
- 总是 优先于查找对象的 .Value
属性 (ValueFromPipelineByPropertyName
) - 在其他单词:没有任何输入对象,无论其类型如何,都受其 .Value
属性 的约束 - 任何输入对象都被绑定 本身 .
在本例中,Import-CliXml
输出的对象是[Deserialized.System.Collections.DictionaryEntry]
类型;它们绑定到 -Value
,然后在设置环境变量时转换为 string(环境变量只能包含 string值);该类型的字符串表示形式是 System.Collections.DictionaryEntry
- 无论其 .Value
属性 - 因此该通用字符串 - 无用地 - 设置为环境变量的值。
这种有问题的行为已经 reported on GitHub。
我是 PowerShell 的新手,最近开始学习它的一些命令。
现在我想尝试添加、编辑和删除环境路径变量(系统)中的任何路径条目。
但我担心万一出问题,所以我想备份所有环境变量以备不时之需。
我有以下 cmdlet 可以在屏幕上显示特定变量,但是谁能告诉我如何通过 .ps1
PowerShell 将所有环境变量(系统和用户)备份到文本文件脚本?
Get-ChildItem Env:Path
您始终可以将输出发送到文件,通过 "piping"(使用 | 完成)将命令的输出发送到具有 Out-File cmdlet:
的文件Get-ChildItem env: | Out-File test.txt
"test.txt" 是您的文件名。
注意:PowerShell的env:
驱动只反映了当前进程的环境变量-至坚持改变系统或当前用户的环境变量,你必须直接使用.NET框架 - 见我的
以下代码片段使用了 env:
,因此仅展示了如何 保存和恢复当前 进程[=100 的所有环境变量=]:
# 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 }
请注意,这 不会 删除任何 new 环境。您可能在此期间创建了变量,但是 - 需要额外的工作来消除这些变量。
注意:Export-CliXml
和 Import-CliXml
被使用,因为它们 启用健壮的往返(序列化/反序列化) values(虽然你不能通常重新创建完全相同的type的对象,只能反序列化look-alikes).
相比之下,使用 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
等调用 - 所以应该不需要通过%
(ForEach-Object
)显式枚举和显式参数传递,如上所用。
不幸的是,从 Windows PowerShell v5.1 / PowerShell Core v6.0.1 开始,-Value
参数的定义方式 also 将输入对象 作为一个整体 绑定到 -Value
(ValueFromPipeline
),这 - 假设 -Value
通常定义为类型 [System.Object]
- 总是 优先于查找对象的 .Value
属性 (ValueFromPipelineByPropertyName
) - 在其他单词:没有任何输入对象,无论其类型如何,都受其 .Value
属性 的约束 - 任何输入对象都被绑定 本身 .
在本例中,Import-CliXml
输出的对象是[Deserialized.System.Collections.DictionaryEntry]
类型;它们绑定到 -Value
,然后在设置环境变量时转换为 string(环境变量只能包含 string值);该类型的字符串表示形式是 System.Collections.DictionaryEntry
- 无论其 .Value
属性 - 因此该通用字符串 - 无用地 - 设置为环境变量的值。
这种有问题的行为已经 reported on GitHub。