我是PowerShell的新手,最近开始学习它的一些命令。
现在,我正在尝试从环境Path变量(System)中添加、编辑和删除任何路径条目。
但我担心的情况下,如果出了什么问题,所以我想采取备份的所有环境变量的情况下,我需要恢复。
我有下面的小工具来在屏幕上显示特定的变量,但是任何人都可以让我知道如何通过.ps1
PowerShell脚本将所有环境变量(系统和用户)备份到文本文件中吗?
Get-ChildItem Env:Path
字符串
我是PowerShell的新手,最近开始学习它的一些命令。
现在,我正在尝试从环境Path变量(System)中添加、编辑和删除任何路径条目。
但我担心的情况下,如果出了什么问题,所以我想采取备份的所有环境变量的情况下,我需要恢复。
我有下面的小工具来在屏幕上显示特定的变量,但是任何人都可以让我知道如何通过.ps1
PowerShell脚本将所有环境变量(系统和用户)备份到文本文件中吗?
Get-ChildItem Env:Path
字符串
2条答案
按热度按时间unftdfkk1#
注意事项:PowerShell的
env:
驱动器仅反映 * 当前进程 * 的环境变量-要 * 持久地 * 更改系统或当前用户的环境变量,您必须直接使用.NET Framework-请参阅this answer。因此,下面的代码片段使用了
env:
,只展示了如何保存和恢复当前 * 进程**的所有环境变量:字符串
请注意,这不会 * 删除 * 任何 * 新的 * env.变量,您可能已经创建了在此期间-需要额外的工作来消除这些:请参阅this answer。
注意事项:
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
-因此 * 应该 * 不需要通过%
进行显式枚举和显式参数传递(ForEach-Object
),如上所述。然而,不幸的是,从Windows PowerShell v5.1 / PowerShell Core v6.0.1开始,
-Value
参数的定义方式 * 还 * 将输入对象 * 作为一个整体 * 绑定到-Value
(ValueFromPipeline
),如果-Value
一般定义为[System.Object]
类型,则 * 始终 * 优先于查找对象的.Value
* 属性 *(ValueFromPipelineByPropertyName
)-换句话说:**没有输入对象,无论其类型如何,都不会被其.Value
属性绑定-任何输入对象都被 * 绑定为自身 *。在本例中,
Import-CliXml
输出的对象的类型为[Deserialized.System.Collections.DictionaryEntry]
;它们被绑定到-Value
,然后在设置环境变量时转换为 string(环境变量只能包含 string 值);该类型的字符串表示是System.Collections.DictionaryEntry
-与其.Value
属性无关-并且该通用字符串因此被无用地设置为环境变量的值。此问题行为已在GitHub issue #5543中报告。
7gcisfzg2#
您始终可以通过“管道”(使用|)将命令输出到具有Out-File cmdlet:
字符串
“test.txt”是您的文件名。