Variável de ambiente PATH diferente para Windows de 32 bits e 64 bits - é possível?

14

É possível ter PATHuma variável de ambiente inteira ou parte específica para o tipo de imagem do processo em execução (32 bits / 64 bits)? Quando executo algum aplicativo a partir de 64 bits cmd.exe, gostaria que ele escolhesse a versão de 64 bits da biblioteca OpenSSL, enquanto que quando executo algum aplicativo a partir de 32 bits cmd.exe, gostaria que ele escolhesse a versão de 32 bits da biblioteca OpenSSL.

ACOMPANHE
where.exe não encontra bibliotecas OpenSSL quando a variável% ProgramFiles% é usada na variável de ambiente PATH

Piotr Dobrogost
fonte

Respostas:

9

Faça com que %ProgramFiles%a %ProgramFiles(x86)%comutação de variáveis ​​env trabalhe para você:

Pastas lugar com x32 e x64 versões de biblioteca OpenSSL em apropriada %programfiles%e %ProgramFiles(x86)%diretórios e na PATHvariável de ambiente, use uma referência a estas pastas através da %programfiles%variável.

Dessa forma, quando você estiver executando em um ambiente de 32 bits, sua PATHentrada %programfiles%/OpenSSL/será resolvida automaticamente %ProgramFiles(x86)%/OpenSSL/em um disco.

romka
fonte
1
Bem, eu tenho alguns problemas para fazê-lo funcionar. echo %programfiles%mostra um caminho diferente, dependendo do tipo de cmd.exe do qual é executado, mas where ssleay32.dllnos dois tipos de cmd.exe (32 bits e 64 bits) não é possível encontrar essa dll e exibe INFO: Could not find files for the given pattern(s).Alguma idéia?
Piotr Dobrogost
Isso pode ajudar: Embora isso possa ajudar: stackoverflow.com/questions/906310/…
Darokthar
1
Se uma das DLLs é um 32-bit um, na máquina de 64 bits que deve entrar em C: \ janelas \ syswow64 pasta
Romka
Isso não funciona para mim. Quando eu incluo% ProgramFiles% na definição da variável PATH, ele não é expandido, portanto meu exe não encontra suas DLLs.
Carlos A. Ibarra
7

A resposta (marcada como correta) fornecida pelo romka é simples e elegante, mas infelizmente não funciona (pelo menos no Windows 7 e Windows 8 de 64 bits, não forcei mais o teste).

O problema vem do fato de que a variável% PATH% do sistema nem sempre expande outra variável env: ela trabalha com% SYSTEMDRIVE% por exemplo, mas infelizmente não para% PROGRAMFILES%. A Wikipedia sugere que esse comportamento é proveniente do nível de indireção (% SYSTEMDRIVE% não se refere a uma terceira variável env).

A única solução que encontrei é usar o Redirecionador de sistema de arquivos mágica do e os diretórios System32 / SysWoW64, conforme sugerido nos comentários.

Para evitar a implantação direta de DLLs no diretório do Windows, que geralmente é difícil de manter, é possível implantar um softlink em um diretório personalizado (funciona no Windows Vista e em versões posteriores do Windows):

A propósito, desculpe-me por não comentar diretamente nas postagens relevantes: atualmente não há reputação suficiente na minha conta para fazer isso.

Baptiste Chardon
fonte
5

Sim, é absolutamente possível. Basta escrever três arquivos .bat. O primeiro deve ficar assim:

@echo off
if "%1" == "" goto x86
if not "%2" == "" goto usage

if /i %1 == x86 goto x86
if /i %1 == ia64 goto ia64
goto usage

:x86
if not exist "%~dp0bin\x86.bat" goto missing
call "%~dp0bin\x86.bat"
goto :eof

:ia64
if not exist "%~dp0bin\ia64.bat" goto missing
call "%~dp0bin\ia64.bat"
goto :eof

:usage
echo Error in script usage. The correct usage is:
echo %0 [option]
echo where [option] is: x86 ^| ia64
echo:
echo For example:
echo %0 x86
goto :eof

:missing
echo The specified configuration type is missing. The tools for the
echo configuration might not be installed.
goto :eof

O segundo e o terceiro arquivo .bat são basicamente os mesmos, exceto que diferem em seus nomes. O primeiro será chamado x86.bat, o segundo ia64.bat, e eles serão colocados em uma pasta chamada bin, que está acima do primeiro arquivo bat. Você terá isso:

PATH\first.bat
PATH\bin\x86.bat
PATH\bin\ia64.bat

O conteúdo do segundo e terceiro arquivo .bat deve ficar assim:

@set PATH=THE PATH YOU WANT

Você pode criar um link para o primeiro arquivo .bat, que terá as seguintes configurações:

Alvo:% comspec% / k "PATH \ first.bat" OPÇÃO | Onde OPTION é x86 ou ia64

Início em: CAMINHO | Onde PATH é o caminho para o seu first.bat

O script é o script simplificado que a Microsoft usa para iniciar a linha de comando correta para o ambiente do Visual Studio. Você pode simplesmente expandir esses scripts para N ambientes. Adicionando mais arquivos .bat para diferentes ambientes e editando o first.bat com mais opções e instruções goto. Espero que seja auto-explicativo.

E espero que a Microsoft não me processe por usar seu script.

EDITAR:

Ah, eu acho que te entendi um pouco. Para a linha cmd de 32 bits, o link deve ser criado como:

Destino:% windir% \ SysWoW64 \ cmd.exe "PATH \ first.bat" x86

EDIT2:

Tente algo como:

if "%ProgramFiles%" == "%ProgramFiles(x86)%" goto x64_PATH
if "%ProgramFiles%" == "%ProgramW6432%" goto x86_PATH

:x64_PATH
@set PATH=YOUR 64 bit PATH
SOME_PATH\your64BitApp.exe
goto :eof

:x86_PATH
@set PATH=YOUR 32bit PATH
SOME_PATH\your32BitApp.exe
goto :eof
Darokthar
fonte
1
Você pode corrigir isso, apenas para maior clareza - as chances são de que eles não estejam usando a tecnologia Intel de 64 bits (ia64 - CPUs Itanium), mas sim a tecnologia AMD64 de bits, comumente referida como x64.
Multiverse IT
Obrigado pela sua resposta. A ideia é boa. No entanto, eu estava procurando por uma solução no nível do sistema como a usada para modificar %ProgramFiles%variáveis. (Citação: O próprio% ProgramFiles% depende se o processo que solicita a variável de ambiente é ele próprio 32 bits ou 64 bits (isso é causado pelo redirecionamento de 64 bits do Windows no Windows). En.wikipedia.org/wiki/ … )
Piotr Dobrogost
1

Eu queria apenas resumir a resposta que obtive seguindo os links fornecidos na resposta de Baptiste Chardon. Usando a mklinkferramenta de linha de comando para criar um link simbólico diretório C:\Windows\system32 e em C:\Windows\SysWOW64, cada um com o mesmo nome (embora alvos diferentes), você pode, em seguida, basta adicionar esse em C:\Windows\system32que o Pathvariável de ambiente. Por exemplo:

C:\> mklink /D C:\Windows\SysWOW64\my_XXbit_dlls C:\dlls\x86
symbolic link created for C:\Windows\SysWOW64\my_XXbit_dlls <<===>> C:\dlls\x86
C:\> mklink /D C:\Windows\System32\my_XXbit_dlls C:\dlls\x64
symbolic link created for C:\Windows\System32\my_XXbit_dlls <<===>> C:\dlls\x64
user74094
fonte
0

Eu tive esse problema e a resposta é a seguinte:

O caminho para a sua variável de sistema nas máquinas de 64 bits é c:\progra~2. Você precisa ter um caminho sem espaço para sua variável ambiental, caso contrário, o sistema não lerá mais do queC:\programs .

Em nossas máquinas de 32 bits, os programas da empresa com variável de ambiente são c:\program filese, nas máquinas de 64 bits, é c:\progra~2. Em seguida, definimos nossos atalhos para os usuários%companyprograms%\...

Você pode fazer isso por meio da diretiva de grupo ou por script.

JRubinstein
fonte
-1

Como o romka indicado no acompanhamento, a resposta simples é o diretório SysWOW64.

Felizmente, os instaladores da Shining Light Productions cuidam disso para você. Basta executar os instaladores de 32 bits e 64 bits e optar por copiar os .DLLs no diretório "Sistema" do Windows e o diretório apropriado será escolhido para os .DLLs (ou seja, os .DLLs de 64 bits entrarão no System32 e os .DLLs de 32 bits no SysWOW64.

Depois de fazer isso, meus aplicativos de 32 bits encontram os .DLLs de 32 bits e os meus aplicativos de 64 bits encontram os .DLLs de 64 bits.

etinthelab
fonte