我发现很难让我的环境变量在不同的机器上保持同步。我只想从一台计算机导出设置并导入到其他计算机。
我认为这应该是可能的,但不知道该怎么做。谁能帮我?谢谢。
我发现很难让我的环境变量在不同的机器上保持同步。我只想从一台计算机导出设置并导入到其他计算机。
我认为这应该是可能的,但不知道该怎么做。谁能帮我?谢谢。
您可以使用 RegEdit 导出以下两个密钥:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
HKEY_CURRENT_USER\Environment
第一组是系统/全局环境变量;第二组是用户级变量。根据需要进行编辑,然后在新机器上导入 .reg 文件。
我会使用命令提示符中的 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的答案与一些修改相结合,
.reg
到当前目录代码:
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
您可以在命令行或注册表中访问环境变量。
命令行
如果您想要一个特定的环境变量,那么只需键入它的名称(例如PATH
),然后是 a>
和要写入的文件名。以下将 PATH 环境变量转储到名为 path.txt 的文件中。
C:\> PATH > path.txt
注册方法
Windows 注册表将所有环境变量保存在不同的位置,具体取决于您所使用的设置。您可以使用注册表导入/导出命令将它们转移到另一台 PC。
对于系统变量:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
对于用户变量:
HKEY_CURRENT_USER\Environment
我最喜欢的方法是把它写成一个批处理脚本,将用户变量和系统变量组合到一个备份文件中,就像这样,创建一个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')"}
它能做什么
因此,在源机器上运行后,只需将输出传输到目标机器并执行(如果在机器级别设置则提升提示)
基于@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 年前的答案不满意,我的处理方式有所不同。这种方法可以与早于 Win 8 的 Win OS 风格一起使用SET
,而不是SETX
在SETX
开始使用时使用。
注意:
确保为您喜欢的编辑器调整 RegEx 以获得所需的结果。对于 RegEx 特定问题,请从各种来源寻求帮助,包括此处提供的教程。我正在使用 Sublime Text 4 搜索和替换 RegEx 示例。
警告:
我想指出,盲目地复制和粘贴此过程很可能会破坏现有设置并提取源数据。它不会合并两组数据。这是您的责任,我对可能造成的任何损害不承担任何责任。此外,您应该花时间从提取的 env 变量中删除会造成问题或没有价值的设置,例如更改的路径和不同的硬件指标(例如 CPU 核心数)。
这种方法避免了将 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 版本后,就可以进行复制了。每个 DestinationMachine 文件的副本并将它们命名为:
SystemEnvVariablesFinalMerge.txt
UserEnvVariablesFinalMerge.txt
我们还没有完成,这只是您可以放心编辑的文件版本。保留文件的 DestinationMachine 版本。将它们视为备份。
接下来我们将 SourceMachine 文件合并到 FinalMerge 文件中。这提供了一种手动检查以清除重复数据和不良数据以及最终输出的方法。有很多方法可以做到这一点,但我使用的最简单的方法是准备数据以进行比较,然后比较和合并,然后重新组合数据以使其可导入。
将此搜索和替换 RegEx 模式应用于每个 Source 和 FinalMerge 文件:
搜索模式:
(^\w+=|.*?(?:;|$))
替换模式:
\1\n
然后使用 Beyond Compare 4、Meld 或 Winmerge 等差异工具将每个 Source 与 FinalMerge 进行比较。我个人最喜欢的是 Beyond Compare 4。请记住,此时的数据可能未排序,因此您此时可以注意对数据进行排序,注意不要混淆从键到值结构的变量。如何使用这些工具不在此范围内。从文件的 FinalMerge 版本中删除您此时不希望导入的环境变量。
对应用清理的合并感到满意后,将更改保存在 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
}
}
注意:
如果您在此处遇到错误,可能是由于需要转义字符。您需要手动输入该环境变量或找出正确的转义字符序列来绕过它。
如果事情发生了可怕的错误,您应该能够使用前面的命令和备份恢复到您的 DestinationMachine 版本的环境变量。