用于备份和更改环境变量的批处理文件

用于备份和更改环境变量的批处理文件

如何编写一个备份和恢复环境变量的批处理文件。

之后,我想设置一些变量,如果出现问题,我可以使用这个创建的批处理文件回滚更改。

答案1

使用reg系统工具:

要保存系统环境:

reg save "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" env_sys_backup.hiv /y

要保存用户环境:

reg save "HKCU\Environment" env_usr_backup.hiv /y

恢复:

reg restore "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" env_sys_backup.hiv
reg restore "HKCU\Environment" env_usr_backup.hiv

请参阅reg /?以获得帮助。

答案2

如果您运行的是 Windows,则无法在没有其他软件的情况下从批处理文件中设置全局环境变量。必须通过控制面板、系统小程序进行设置,才能使它们成为全局变量。

至于捕获它们,使用 SET >env.txt将会捕获它们。

该批处理文件应该读取先前的输出并将其重置为当前窗口:

for /f %%a in (env.txt) do (
set %%a

答案3

我觉得这听起来有点危险。SET 不会出错,SET >file 将备份您的变量,但要恢复它们需要一些技巧,而且似乎有点冒险,而且真的有点过头了。

如果只有一些是坏的,为什么要全部修复呢?

setx 可能会出错。

之所以需要这些技巧,是因为 SET 不区分用户变量和机器/系统变量。REG QUERY 可以帮助显示环境变量,而不是 SET,但需要一些技巧。而且这并不危险,只是需要一些技巧。

此外,你可能会认为,由于 SET 显示 VARIABLE=VALUE,所以如果你在 setx 中使用 VALUE,它就会把那个值放进去。但是 setx 有一些有趣的行为,如果你这样做

设置 ggg=r"r <-- 将 ggg 设置为 r"r

但如果你这样做

setx ggg r"r <-- 将 ggg 设置为 rr ,如果你想要 r"r 你必须执行 \"

也许 setx 吃掉引号(我的意思是,在值内)并不是一件坏事,因为您可能无论如何都不想在其中有任何引号。但值得知道发生了什么。

设置 ggg=rrr sss <--- 将 ggg 设置为 rrr sss

setx ggg rrr sss <--- 将 ggg 设置为 rrr

因此 setx 需要用引号将值括起来。如果您不知道这一点,并尝试使用 setx 替换所有环境变量,则可能会出错。

因此它要求在值周围加上引号(在明显的情况下,即值中有空格),并在值内使用引号。此外,当使用 -m(对系统变量执行此操作)时,它需要将其放在末尾。如果您将其放在开头,它会将其视为变量值 -m

所有这些都不是显而易见的。

并且它永久地设置变量。

因此,我个人不想在自动化操作中对 SET 输出的每个变量都使用 setx,这没有必要,而且如果我这样做,我希望对其进行严格的测试。

如果我在一个变量上使用它,我会倾向于检查它是否有效,因为我可能犯了一个错误,它可能有一个怪癖,而且它是永久性的。

就我个人而言,我会备份变量,例如使用 SET.. 或 SET | find /i "path" >a 在路径上执行 setx 之前..

但是不会尝试对从 SET 或 REG QUERY 转储的内容使用 setx,因为我不想永久更改没问题的变量。很多变量,其中可能有一个很有趣。

如果您没有编写批处理文件来更改所有环境变量,那么您就不会让所有变量被清除或弄乱!

您可能需要做的是,使用单独的 setx 命令为要替换的变量创建一个 bat 文件,然后备份该文件

我建议这些设置 mvar=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment setx mvar "%mvar%" set uvar=HKCU\Environment setx uvar "%uvar%"

尽管如此,

并且仍然不要一次性完成所有事情。

这里有 2 个 for /f 命令可以帮助您生成 2 个 bat 文件,一个用于您的用户变量,一个用于您的环境变量,所以可以帮助您。

:: delete a.bat and b.bat so it doesn't append onto what's already there  
del a.bat
del b.bat 



C:\>for /f "tokens=1,2,3" %f in ('reg query "%uvar%" ^| tail -n +5') do @echo setx %f "%h" >>a.bat


C:\>for /f "tokens=1,2,3" %f in ('reg query "%mvar%" ^| tail -n +5') do @echo setx %f "%h" -m >>b.bat

然后编辑它们并确保它们只包含您想要的内容..并且您不会看到任何有趣的内容。

你最好不要那样做,而且...你知道你可以做什么..就是备份所有系统变量和用户变量,但不说 setx,这样你就可以备份它们,而不必担心对所有变量都执行sex setx。

并且不需要在 %h 周围加上引号,因为没有写入 setx。

del a.bat del b.bat

C:\>for /f "tokens=1,2,3" %f in ('reg query "%uvar%" ^| tail -n +5') do @echo %f %h >>a.bat

C:\>for /f "tokens=1,2,3" %f in ('reg query "%mvar%" ^| tail -n +5') do @echo %f %h >>b.bat

那么如果你可以在它们前面添加单词 set。

C:\>for /f "tokens=1,2,3" %f in ('reg query "%uvar%" ^| tail -n +5') do @echo set %f=%h >>a.bat

C:\>for /f "tokens=1,2,3" %f in ('reg query "%mvar%" ^| tail -n +5') do @echo set %f=%h >>b.bat

运行那些。

看看一切是否正常运作。

那么也许您想永久设置所有环境变量,大概是在没有必要的时候(因为几乎从来不需要)。那么您可以从 for 的 set 版本更改为 setx 版本。

我不会编写一个 bat 文件来执行此操作,因为它没有经过充分测试,但这就是任何批处理文件中所需要的一切。

请自行承担风险将其组合在一起,并且我建议您在这样做时对其进行充分的测试,例如在虚拟机上进行测试。

答案4

也许您可以将脚本放在 SETLOCAL / ENDLOCAL 之间,这样对环境变量的所有更改都变为本地更改,并且在 ENDLOCAL 之后,您的旧环境将恢复。

相关内容