如何在窗口中导出和导入环境变量?

我发现很难让我的环境变量在不同的机器上同步。我只想从一台计算机导出设置并导入到其他计算机。

我认为这应该是可能的,但不知道如何做到这一点。有人可以帮助我吗? 谢谢。

252451 次浏览

您可以使用 RegEdit 导出以下两个密钥:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment


HKEY_CURRENT_USER\Environment

第一组是系统/全局环境变量; 第二组是用户级变量。根据需要编辑,然后导入。新机器上的注册文件。

您可以在命令行或注册表中访问环境变量。

命令行

如果你想要一个特定的环境变量,只需要输入它的名称(例如 PATH) ,后面跟一个 >,以及要写入的文件名。下面将把 PATH 环境变量转储到名为 PATH.txt 的文件中。

C:\> PATH > path.txt

注册方法

Windows 注册表保存所有的环境变量,具体位置取决于您使用的是哪个集合。您可以使用注册表导入/导出命令将它们转移到其他 PC。

系统变量:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

用户变量:

HKEY_CURRENT_USER\Environment

我将使用命令提示符中的 SET 命令导出所有变量,而不是像上面建议的那样只导出 PATH。

C:\> SET >> allvariables.txt

要导入变量,可以使用一个简单的循环:

C:\> for /F %A in (allvariables.txt) do SET %A

要导出用户变量,请打开命令提示符并使用/e 的 regedit

例如:

regedit /e "%userprofile%\Desktop\my_user_env_variables.reg" "HKEY_CURRENT_USER\Environment"

结合 @ vincsilver@ jdigital的答案和一些修改,

  1. 输出 abc0到工作目录
  2. 加上日期标记

密码:

set TODAY=%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%


regedit /e "%CD%\user_env_variables[%TODAY%].reg" "HKEY_CURRENT_USER\Environment"
regedit /e "%CD%\global_env_variables[%TODAY%].reg" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

产出需求:

global_env_variables[2017-02-14].reg
user_env_variables[2017-02-14].reg

我最喜欢的方法是将它作为一个批处理脚本写出来,将用户变量和系统变量组合成一个单独的备份文件,像这样,创建一个 environment-backup.bat文件并放入其中:

@echo off
:: RegEdit can only export into a single file at a time, so create two temporary files.
regedit /e "%CD%\environment-backup1.reg" "HKEY_CURRENT_USER\Environment"
regedit /e "%CD%\environment-backup2.reg" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"


:: Concatenate into a single file and remove temporary files.
type "%CD%\environment-backup1.reg" "%CD%\environment-backup2.reg" > environment-backup.reg
del "%CD%\environment-backup1.reg"
del "%CD%\environment-backup2.reg"

这将创建 environment-backup.reg,您可以使用它重新导入现有的环境变量。这将 添加和覆盖新的变量,但是 没有删除现有的变量:)

下面是我的 PowerShell 方法

gci env:* | sort-object name | Where-Object {$_.Name -like "MyApp*"} | Foreach {"[System.Environment]::SetEnvironmentVariable('$($_.Name)', '$($_.Value)', 'Machine')"}

它的作用

  1. 挖掘所有环境变量
  2. 过滤掉它们
  3. 发出在另一台计算机上重新创建它们所需的格式化 PowerShell (假设所有设置都是在计算机级别设置的)

因此,在源计算机上运行此命令之后,只需将输出传输到目标计算机并执行(如果在计算机级设置,则提高提示)

基于@Mithrl 的 回答的 PowerShell 脚本

# export_env.ps1
$Date = Get-Date
$DateStr = '{0:dd-MM-yyyy}' -f $Date


mkdir -Force $PWD\env_exports | Out-Null


regedit /e "$PWD\env_exports\user_env_variables[$DateStr].reg" "HKEY_CURRENT_USER\Environment"
regedit /e "$PWD\env_exports\global_env_variables[$DateStr].reg" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

不满足于12年前的答案,我对这个问题的处理方式略有不同。这种方法可以通过使用 SET而不是 SETX(SETX开始使用时)来处理比 Win 8更早的 Win OS 风格。

注意:
确保为您首选的编辑器调优 RegEx 以实现所需的目标 有关正则表格的具体问题,请向各 源包括 从这里可以获得教程。我使用崇高文本4搜索和替换正则表达式的例子。

警告:
我想指出的是,遵循这一过程 盲目的复制和粘贴很可能会破坏现有的设置 它没有合并源数据的两个集合 这是你的责任,我不负任何责任 任何可能造成的损害。此外,你应该花时间 从提取的 env 变量中删除引起问题或 没有值,例如改变了路径和不同的硬件指标,例如 中央处理器核心计数。

这种方法避免了将 System env 变量和 User env 变量混合使用,这种混合使用是以前的一些答案所不能解决的问题。

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment">>SystemEnvVariablesSourceMachine.txt
reg query "HKEY_CURRENT_USER\Environment">>UserEnvVariablesSourceMachine.txt

清理刚刚创建的文件! 导入成功取决于此! 使用能够进行 RegEx 的编辑器,并使用以下搜索和替换:

注意: 一些 RegEx 引擎/工具需要使用 $字符来 表示替换模式中的反向引用 在搜索和替换的预期结果给那一个尝试。

搜寻模式:

(?:\A\r?\n|^HKEY_CURRENT_USER\\Environment\r?\n?|^HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\r?\n?|^\r?\n$|\r?\n\Z)

替换模式(字面意思为空) :

Literally Empty

然后

搜寻模式:

^\s+(.*?)\s{4}\w+\s{4}(.*?)$

更换图案:

\1=\2

它强烈建议您花一点时间在目标计算机上使用这些文件名执行上述步骤:

SystemEnvVariablesDestinationMachine.txt
UserEnvVariablesDestinationMachine.txt

这也将作为即将进行的导入的备份。

一旦目的地机器版本的文件被清理干净,它的时间,使一个副本。每个 DestinationMachine 文件的副本,并将它们命名为:

SystemEnvVariablesFinalMerge.txt
UserEnvVariablesFinalMerge.txt

我们还没有完成,这只是一个版本的文件,您可以安全地编辑。不要使用 DestinationMachine 版本的文件。就当他们是后备吧。

接下来,我们将把 SourceMachine 文件合并到 FinalMerge 文件中 手动检查清除重复和错误数据,然后最终输出。有很多方法 但是我使用的最简单的方法是为比较准备数据,然后比较和合并,然后重新组合数据 因此,它的重要性。

对每个 Source 和 FinalMerge 文件应用此搜索并替换 RegEx 模式:

搜寻模式:

(^\w+=|.*?(?:;|$))

更换图案:

\1\n

然后使用诸如 Beyond Compare 4、 Meld 或 Winmerge 之类的差异工具将每个 Source 与 FinalMerge 进行比较。我个人最喜欢的是《超越比较4》。请记住,此时的数据可能无法排序 因此,您可以在这个时候注意对数据进行排序,注意不要混淆从键到值结构的变量。如何使用这些工具超出了这里的范围。删除此时不希望从文件的 FinalMerge 版本导入的 env 变量。

一旦你对合并和清理应用感到满意,保存 FinalMerge 文件中的更改,然后使用以下 RegEx 模式恢复键到值映射:

搜寻模式:

(.)$\r?\n

更换图案:

\1

然后在目标机器上用 powershell 导入变量:

Get-Content .\UserEnvVariablesFinalMerge.txt | ForEach-Object {
$envVarDataSplit = $($_).split("=")
if($($envVarDataSplit).count -gt 0)
{
Write-Output "Key: $($envVarDataSplit[0]) ~ Value: $($envVarDataSplit[1])"
SETX $envVarDataSplit[0] "$($envVarDataSplit[1])"
}
}

注意:
以管理员身份运行 powershell 以使其成功,否则您将失败 出错。

Get-Content .\SystemEnvVariablesFinalMerge.txt | ForEach-Object {
$envVarDataSplit = $($_).split("=")
if($($envVarDataSplit).count -gt 0)
{
Write-Output "Key: $($envVarDataSplit[0]) ~ Value: $($envVarDataSplit[1])"
SETX $envVarDataSplit[0] "$($envVarDataSplit[1])" /M
}
}

注意:
如果您在这里遇到错误,可能是由于需要 转义一个字符。您需要手动输入该 env 变量或找出正确的转义字符序列来获取 在它周围。

如果出现严重错误,您应该能够使用前面的命令和备份恢复到 env 变量的 DestinationMachine 版本。