代码之家  ›  专栏  ›  技术社区  ›  Vicky Dev

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

  •  5
  • Vicky Dev  · 技术社区  · 8 年前

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

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

    但我担心的是,如果出现任何问题,那么我想备份所有环境变量,以防需要恢复。

    我有以下cmdlet可以在屏幕上显示特定变量,但是有谁能告诉我如何通过 .ps1 PowerShell脚本?

    Get-ChildItem Env:Path
    
    2 回复  |  直到 7 年前
        1
  •  8
  •   mklement0    7 年前

    注: PowerShell的 env: 驱动器仅反映当前的环境变量 过程 -至 坚持不懈地 更改系统或当前用户的环境变量时,必须使用。NET framework-请参阅 this answer 我的。

    以下代码段使用 环境: ,因此仅显示如何 保存并还原当前 过程 :

    # 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 .

    设置项目 通过管道接收具有 属性 用那些名字( .PSPath , .Value ),他们 应该 -PSPath ( -文字路径 )和 -价值 参数,启用调用,例如 ... | Set-Item -就这样 应该 不需要显式枚举和显式参数传递 % ( ForEach-Object ),如上所述。

    然而,不幸的是,从Windows PowerShell v5.1/PowerShell Core v6.0.1开始 -价值 参数的定义方式如下: 而且 绑定输入对象 作为一个整体 -价值 ( ValueFromPipeline ),鉴于此 -价值 一般定义为类型 [System.Object] - 一成不变 优先于查找对象的 .价值 所有物 ( ValueFromPipelineByPropertyName )-换句话说: 任何输入对象,无论其类型如何,都不会受到其 .价值 属性-绑定任何输入对象 就像它自己一样 .

    在本例中,通过 导入CliXml 属于类型 [Deserialized.System.Collections.DictionaryEntry] ; 他们一定会 -价值 ,然后转换为 设置环境变量时(环境变量只能包含 一串 价值观);该类型的字符串表示为 System.Collections.DictionaryEntry -无论其 .价值 属性,因此该泛型字符串被无用地设置为环境变量的值。

    这种有问题的行为 reported on GitHub .

        2
  •  -1
  •   jonasm    8 年前

    通过“管道”(使用|)将命令的输出发送到具有 Out-File cmdlet :

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

    “test.txt”是文件名。