AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1464316
Accepted
sancho.s ReinstateMonicaCellio
sancho.s ReinstateMonicaCellio
Asked: 2019-07-27 02:03:35 +0800 CST2019-07-27 02:03:35 +0800 CST 2019-07-27 02:03:35 +0800 CST

Evite a leitura alfabética das variáveis ​​de ambiente do Windows

  • 772

Normalmente, se eu definir uma variável de ambiente do Windows 10 do usuário (var 1) em termos de outra (var 2), a var 2 deve preceder a var 1 em ordem alfabética para que funcione. Isso é identificado aqui , por exemplo

Por exemplo, na janela

insira a descrição da imagem aqui

isto

APYTHONDIR  ->  C:\Users\user1\myprogs
PATH  ->  %APYTHONDIR%

funciona, mas isso

PYTHONDIR  ->  C:\Users\user1\myprogs
PATH  ->  %PYTHONDIR%

não.

Existe alguma maneira de evitá-lo? Trabalhando em torno disso?

Pretendo obter uma solução que funcione funcionalmente como se as variáveis ​​fossem definidas via registro (ou Painel de Controle).

Sempre posso usar nomenclatura para garantir que as definições "aninhadas" sigam a ordem alfabética. Isto não é o que eu quero.

Pensei em configurá-los na ordem desejada em um arquivo de lote de inicialização ( autoexec.nt, ou o que for atual). Não tenho certeza se isso funcionaria para qualquer aplicativo que exija as variáveis ​​de ambiente. Por exemplo, integração simbólica de oitava precisando encontrar pythonalgum lugar no PATH, com o diretório PATHsendo adicionado dessa maneira.

EDIT De acordo com as respostas de harrymc e eu, e seguindo a discussão, foi isso que tentei:

  1. Criar um arquivo set_env_vars.batem um diretório arbitrário e definir um atalho para ele em %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup.

  2. Adicionando uma linha set /P PTEST=Enter value for PTESTpara set_env_vars.batgarantir que o arquivo esteja sendo lido durante o logon.

  3. Fazendo logoff e logon. Eu verifiquei que set_env_vars.baté lido.

Então, eu adicionei linhas

set ZTEST_DIR=C:\ztest
set YTEST_DIR=%ZTEST_DIR%;C:\ytest

para set_env_vars.bat. Além disso, faça logoff / logon. Isso não me deu vars ZTEST_DIRe YTEST_DIRno meu ambiente.

Então, eu os substituí por linhas

setx ZTEST_DIR C:\ztest
set /P WAITING_DUMMY=Enter value for WAITING_DUMMY   
setx YTEST_DIR %ZTEST_DIR%;C:\ytest

em set_env_vars.bat. (A segunda linha para tentar dar tempo ao sistema para definir a primeira var). Além disso, faça logoff / logon. Isso me deu varios

YTEST_DIR=;C:\ytest
ZTEST_DIR=C:\ztest

no meu ambiente.

windows-10 windows
  • 2 2 respostas
  • 456 Views

2 respostas

  • Voted
  1. harrymc
    2019-08-01T10:13:48+08:002019-08-01T10:13:48+08:00

    Se você fizer isso set "a=x%b%y", então aé definido exatamente assim e %b%só será expandido quando necessário. É por isso que a ordem alfabética não tem importância. As variáveis ​​são substituídas quando seu valor é necessário e PATHé um exemplo de um valor que é imediatamente necessário.

    Para automatizar a configuração de variáveis ​​de ambiente, coloque os comandos SET em um arquivo batch ( .bat) e copie o arquivo para a pasta Inicialização .

    Sua pasta de inicialização pessoal deve ser C:\Users\<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, enquanto a pasta de inicialização Todos os usuários deve ser C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup.

    Pergunta: O que estou fazendo abaixo que é diferente do que você faz? Você pode nos mostrar uma captura de tela semelhante se estiver obtendo resultados diferentes.

    insira a descrição da imagem aqui


    Quanto ao exemplo que você postou, os resultados são os esperados. Você usou o setxcomando, que define variáveis ​​de ambiente para o usuário no registro, mas não no ambiente local . Você precisaria iniciar um novo prompt de comando na área de trabalho para se beneficiar dessa variável.

    O importante aqui é que setxfunciona no registro, mas não faz com que o ambiente local seja reavaliado. O ambiente é construído apenas uma vez, quando um processo é iniciado, e permanece o mesmo durante toda a execução (a menos que seja modificado localmente pelo próprio processo). Qualquer filho iniciado por um processo pai herdará o ambiente de seu pai, portanto, nenhuma referência é feita nesse caso ao registro.

    A demonstração abaixo demonstra o problema: A variável é definida no prompt de comando acima, mas não possui um valor local. O prompt de comando inferior é iniciado na área de trabalho e tem esse valor.

    insira a descrição da imagem aqui

    • 2
  2. Best Answer
    sancho.s ReinstateMonicaCellio
    2019-08-01T18:03:19+08:002019-08-01T18:03:19+08:00

    Resumindo:

    1. Arquivo de configuração setvars.cmd(o nome é arbitrário) no diretório %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, ou coloque setvars.cmdem outro lugar e defina um atalho para ele a partir daí.

    2. Nesse arquivo, use (por exemplo)

      setx DIR2 C:\dir2
      set DIR2=C:\dir2
      setx DIR1 %DIR2%;C:\dir1
      set DIR1=%DIR2%;C:\dir1
      

    Testado e funciona. Se o Painel de Controle for usado para definir quaisquer variáveis ​​a partir deste ponto, ele pode atrapalhar as definições aninhadas que não seguem a ordem alfabética .


    **tl;dr**

    Parece haver pelo menos 3 maneiras alternativas de definir variáveis ​​de ambiente do usuário:

    1. Através do Painel de Controle.
      Clique com o botão direito do mouse em computador -> Propriedades -> Configurações avançadas do sistema -> Variáveis ​​de ambiente -> Novo para variáveis ​​de usuário para USER1 -> Digite o nome e o valor da variável -> Ok.
      O uso "aninhado" de variáveis ​​é lido em ordem alfabética .
      As variáveis ​​também são exibidas em ordem alfabética.

    2. Por meio da edição do registro de HKEY_CURRENT_USER\Environment.
      Tecla do Windows -> reged -> Ir HKEY_CURRENT_USER\Environmentpara a barra de endereço -> Editar -> Novo -> REG_EXPAND_SZ-> Digite o nome -> Clique com o botão direito do mouse no nome adicionado -> Modificar -> Digite o valor -> Ok.
      O uso "aninhado" de variáveis ​​é lido na ordem em que foram definidas .
      As variáveis ​​são exibidas em ordem alfabética, apenas por conveniência.
      Isso responde a pergunta, em princípio. Mas se forem usadas definições "aninhadas" que não seguem a ordem alfabética, a pessoa é "proibida" de usar o método do Painel de Controle novamente, caso contrário, ele impõe a leitura da ordem alfabética e bagunça as definições.

    3. Via linha de comando / arquivo em lote / autoexec.
      Conforme detalhado abaixo. Ajudado por esta resposta , com o uso adicional de SETX var valueem vez de apenas SET var=value.
      O uso "aninhado" de variáveis ​​é lido na ordem em que foram definidas .
      E com a automação adequada, isso é feito a cada logon, portanto, usar a maneira do Painel de controle possivelmente apenas atrapalharia as definições "aninhadas" para a sessão atual. Este método é provavelmente a melhor combinação .

    Observe que, para evitar ter que fazer logoff para reler as variáveis, pode-se usar this , ou refreshenv.

    Detalhe do método 3 : A forma adequada de atingir o objetivo do OP (obter uma solução que funcione funcionalmente como se as variáveis ​​fossem definidas via registro (ou Painel de Controle), mas evitando a ordem alfabética) é:

    1. Usando um arquivo .bat (ou melhor, um .cmd) , leia durante o logon (método 3), digamos, setvars.cmd.

    2. Nesse arquivo, use setxpara definir variáveis ​​de ambiente no nível do registro (por exemplo, var2). Isso não atualiza o ambiente local .

    3. Para ser capaz de usar definições de variáveis ​​"aninhadas" que duram para a sessão do Windows (por exemplo, var1em termos do valor de var2), é preciso var2também ser definido no processo gerado por setvars.cmd. Conforme item 2 acima, isso não é realizado por setx. Para isso, adicionaria uma setlinha correspondente a cada setxlinha. Com isso, obtém-se o mesmo ambiente no cartório e no processo local. Como alternativa, pode-se tentar usar REG query HKCU\Environment /V ...encadeado com outros comandos (como usado, por exemplo, em refreshenv), mas não fiz isso. Se a maneira do Painel de controle for usada, ela pode atrapalhar as definições aninhadas que não seguem a ordem alfabética. Isso pode ser superado simplesmente executando novamente setvars.cmd.

    • 0

relate perguntas

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • atalho do shell da área de trabalho no painel lateral do explorer

  • Por que não consigo enviar arquivos do Android para o Windows 10?

  • Abrir com em vários arquivos?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve