Arquivo em lote para fazer backup e alterar variáveis de ambiente

2

Como escrevo um arquivo em lotes que faz o backup e restaura as variáveis de ambiente.

Depois disso, quero definir algumas das variáveis e, se algo der errado, posso reverter as alterações com esse arquivo em lote criado.

    
por picknick 19.09.2011 / 14:47

4 respostas

2

Use a ferramenta do sistema reg :

Para salvar o ambiente do sistema:

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

Para salvar o ambiente do usuário:

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

Para restaurar:

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

Veja reg /? para ajuda.

    
por 19.10.2011 / 22:12
1

Se você estiver executando o Windows, não poderá definir as variáveis de ambiente globais a partir de um arquivo de lote sem software adicional. Eles devem ser definidos através do Painel de Controle, applet do sistema para torná-los globais.

Quanto a capturá-los, usar SET >env.txt os capturará.

Este arquivo em lote deve ler a saída anterior e redefini-las para a janela atual:

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

    
por 19.09.2011 / 15:48
0

Parece um pouco perigoso para mim. SET você não pode ir muito errado com, SET > arquivo fará o backup de suas variáveis, mas para restaurá-los todos requer algumas acrobacias e parece um pouco arriscado e exagero na verdade.

Por que restaurá-los se apenas alguns forem ruins?

As coisas podem dar errado com o setx ..

As razões para as acrobacias são que o SET não faz distinção entre variáveis de usuário e variáveis de máquina / sistema. Há REG QUERY que pode ajudar a exibir variáveis de ambiente em vez de SET, com alguma habilidade. E não é arriscado, só requer alguma habilidade.

Além disso, você pode pensar que, como o SET exibe VARIABLE = VALUE, se você usou VALUE no setx, ele colocaria esse valor. Mas o setx tem algum comportamento engraçado, se você fizer isso

set ggg = r "r < - que define ggg para r" r

mas se você fizer

setx ggg r "r < - que define ggg para rr, e se você quiser r" r você tem que fazer \ "

Talvez setx comer aspas (quero dizer, dentro do valor) não é uma coisa ruim porque você provavelmente não quer nenhuma citação de qualquer maneira. Mas vale a pena saber o que está acontecendo.

definir ggg = rrr sss < --- define ggg para rrr sss

setx ggg rrr sss < --- define ggg para rrr

para que o setx precise de aspas em torno do valor. Se você não sabia disso e tentou usar o setx para substituir TODAS as variáveis de ambiente, pode dar errado.

, por isso, exige cotações em torno do valor (em casos óbvios, ou seja, o valor tem espaços) e come citações dentro do valor. E também ao usar -m (o que você faz para variáveis de sistema), ele precisa no final. Se você colocá-lo no começo, ele assume como o valor da variável sendo -m

tudo isso não é óbvio.

e está definindo variáveis permanentemente.

Então, pessoalmente, eu não gostaria de usar o setx para cada variável lançada pelo SET em uma coisa automatizada, isso não é necessário, e se eu quisesse, seria altamente testado ...

E se eu usá-lo em uma variável, tenho a tendência de verificar se funcionou, porque talvez eu tenha cometido um erro, pode ter uma peculiaridade e é permanente.

Pessoalmente, eu fazia backup de variáveis, como com SET .. ou SET | encontrar / i "caminho" > a Antes de fazer o setx no caminho ..

Mas não tentaria usar setx no que é despejado do SET .. ou do REG CONSULTA .. porque não quero alterar permanentemente as variáveis que estão bem. muitas variáveis quando talvez uma é engraçada.

Se você não está escrevendo arquivos em lote para alterar todas as suas variáveis de ambiente, provavelmente não conseguirá limpar todas as suas variáveis ou ficar confuso!

O que você pode querer fazer, é criar um arquivo bat com o comando setx individual para as variáveis que deseja substituir e fazer o backup

Eu sugiro que esses set mvar = HKLM \ SYSTEM \ CurrentControlSet \ Control \ Gerenciador de sessão \ Ambiente setx mvar "% mvar%" set uvar = HKCU \ Ambiente setx uvar "% uvar%"

Tudo o que foi dito,

e ainda não vai fazer as coisas de uma só vez.

aqui estão 2 comandos / f que ajudam você a gerar 2 arquivos bat, um para suas variáveis de usuário, um para suas variáveis de ambiente, então ajude você.

:: 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

edite-os e verifique se eles só têm o que você quer ... e não vê nada de engraçado.

você provavelmente seria melhor não fazê-lo assim, e .. você sabe o que você poderia fazer .. é backup de todas as variáveis do sistema e variáveis do usuário, mas sem dizer setx, então você tem-los backup sem o assustador fazendo sexo setx em todos eles.

e não há necessidade de aspas em torno de% h porque não está escrevendo 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

Então, se você puder adicionar a palavra antes deles.

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

Execute esses.

Veja se as coisas funcionam bem ..

então talvez se você quiser definir todas as variáveis de ambiente permanentemente, presumivelmente quando for desnecessário (já que quase nunca seria necessário). Então você pode mudar da versão do jogo para, para a versão setx.

Eu não vou escrever um arquivo bat para fazer isso porque ele não está bem testado, mas isso é tudo que precisa estar em qualquer arquivo batch.

Junte tudo por sua conta e risco, e eu sugiro que quando você fizer isso, teste bem, como em uma máquina virtual, talvez.

    
por 19.09.2011 / 15:49
0

Talvez você possa colocar seu script entre SETLOCAL / ENDLOCAL, para que todas as suas alterações nas variáveis de env se tornem locais e, após ENDLOCAL, seu ambiente antigo seja restaurado.

    
por 18.08.2014 / 07:17