如何编写一个备份和恢复环境变量的批处理文件。
之后,我想设置一些变量,如果出现问题,我可以使用这个创建的批处理文件回滚更改。
答案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 之后,您的旧环境将恢复。