Vic*_*Dev 4 backup powershell command-line environment-variables command-prompt
我是PowerShell的新手,最近开始学习它的一些命令.
现在我想尝试添加,编辑和删除环境Path变量(System)中的任何路径条目.
但是如果出现任何问题,我会担心这种情况,所以我想备份所有环境变量,以防我需要恢复.
我有以下cmdlet在屏幕上显示特定变量,但任何人都可以告诉我如何通过.ps1PowerShell脚本将所有环境变量(系统和用户)备份到文本文件中?
Get-ChildItem Env:Path
Run Code Online (Sandbox Code Playgroud)
注意: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 }
Run Code Online (Sandbox Code Playgroud)
请注意,这不会删除任何新的环境.但是,您可能在此期间创建了变量,但需要额外的工作来消除这些变量.
注意: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 property(ValueFromPipelineByPropertyName)的优先级- 换句话说:没有输入对象,无论其类型如何,都受其.Value属性约束- 任何输入对象都被绑定为自身.
在手头的情况下,输出的对象Import-CliXml是类型[Deserialized.System.Collections.DictionaryEntry]; 它们被绑定-Value,然后在设置环境变量时转换为字符串(环境变量只能包含字符串值); 该类型的字符串表示是System.Collections.DictionaryEntry- 无论其.Value属性如何- 因此通用字符串 - 无用 - 设置为环境变量的值.
在GitHub上报告了这个有问题的行为.