2

Как мне написать командный файл, который выполняет резервное копирование и восстановление переменных среды.

После этого я хочу установить некоторые переменные, и если что-то пойдет не так, я могу откатить изменения с помощью этого созданного командного файла.

4 ответа4

2

Используйте системный инструмент 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 /? за помощью.

1

Если вы работаете в Windows, вы не можете установить глобальные переменные среды из пакетного файла без дополнительного программного обеспечения. Они должны быть установлены через Панель управления, Системный апплет, чтобы сделать их глобальными.

Что касается захвата их, использование SET >env.txt захватит их.

Этот пакетный файл должен прочитать предыдущий вывод и сбросить их для текущего окна:

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

)

0

Возможно, вы можете заключить свой скрипт между SETLOCAL / ENDLOCAL, чтобы все ваши изменения переменных env стали локальными, а после ENDLOCAL ваше старое окружение будет восстановлено.

0

Это звучит немного опасно для меня. SET, с которым вы не ошибетесь, SET> file создаст резервные копии ваших переменных, но для их восстановления требуется некоторая акробатика, и она кажется немного рискованной и, на самом деле, излишней.

Зачем восстанавливать их все, если только некоторые из них плохие.

С setx все может пойти не так

Причины акробатики в том, что SET не различает пользовательские переменные и переменные машины / системы. Существует REG QUERY, который может помочь отображать переменные окружения вместо SET, с некоторым умением. И это не рискованно, просто требует навыков.

Кроме того, вы можете подумать, что, поскольку SET отображает VARIABLE = VALUE, то, если вы используете VALUE в setx, оно поместит это значение в. Но у setx есть какое-то забавное поведение, если

установить ggg = r "r <- это устанавливает ggg к r" r

но если вы делаете

setx ggg r "r <- это устанавливает для ggg значение rr, и если вы хотите r" r, вам нужно сделать \"

Может быть, setx есть кавычки (я имею в виду, в пределах значения) не так уж и плохо, потому что вы все равно не хотите, чтобы там были какие-либо кавычки. Но стоит знать, что происходит.

Также

set ggg = rrr sss <--- устанавливает ggg в rrr sss

setx ggg rrr sss <--- устанавливает ggg в rrr

поэтому setx нужны кавычки вокруг значения. Если вы этого не знали и пытались использовать setx для замены ВСЕХ переменных среды, вы можете ошибиться.

поэтому он требует кавычек вокруг значения (в очевидных случаях, т.е. значение имеет пробелы) и ест кавычки внутри значения. А также при использовании -m (что вы делаете для системных переменных), это необходимо в конце. Если вы поместите его в начало, оно будет иметь значение переменной -m

все это не очевидно.

и он устанавливает переменные постоянно.

Так что я лично не хотел бы использовать setx для каждой переменной, выдаваемой SET, в автоматическом режиме, это просто не нужно, и если бы я это сделал, я бы хотел, чтобы это было тщательно проверено ...

И если я использую его для одной переменной, я склонен проверять, что она работает, потому что я мог сделать ошибку, она может иметь причуду, и она постоянна.

Лично я бы сделал резервную копию переменных, как с помощью SET .. или SET | find /i "path"> a Перед выполнением setx для path ..

Но я не буду пытаться использовать setx для того, что выгружается из SET .. или из REG QUERY .., потому что я не хотел бы постоянно менять переменные, которые в порядке. много переменных, когда, возможно, один смешной.

Если вы не пишете командные файлы, чтобы изменить все переменные окружения, то вы вряд ли получите все свои переменные уничтоженными или испорченными!

Возможно, вам захочется создать bat-файл с отдельной командой setx для переменных, которые вы хотите заменить, и создайте резервную копию.

Я предлагаю это установить mvar = HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment setx mvar "% mvar%" set uvar = HKCU\Environment setx uvar "% uvar%"

Все, что сказал,

и до сих пор не делать вещи за один раз ..

Вот две команды для /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, так что вы можете создавать их резервные копии без страшного секса. на всех из них.

и нет необходимости в кавычках около% 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

Тогда, если вы могли бы добавить слово перед ними.

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 на версию setx.

Я не собираюсь писать bat-файл для этого, потому что он не очень хорошо протестирован, но это все, что должно быть в любых пакетных файлах.

Соберите все на свой страх и риск, и я советую, когда вы это сделаете, вы хорошо протестируете, как, например, на виртуальной машине.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .