Variable de entorno PATH diferente para Windows de 32 y 64 bits: ¿es posible?

14

¿Es posible tener una PATHvariable de entorno completa o parcial específica para el tipo de imagen del proceso en ejecución (32 bits / 64 bits)? Cuando ejecuto alguna aplicación desde dentro de cmbit.exe de 64 bits, me gustaría que seleccione la versión de 64 bits de la biblioteca OpenSSL, mientras que cuando ejecuto alguna aplicación desde cmd.exe de 32 bits, me gustaría que seleccione la versión de 32 bits de la biblioteca OpenSSL.

SEGUIMIENTO
where.exe no encuentra bibliotecas OpenSSL cuando se utiliza la variable% ProgramFiles% en la variable de entorno PATH

Piotr Dobrogost
fuente

Respuestas:

9

Haga %ProgramFiles%que el %ProgramFiles(x86)%cambio variable de env funcione para usted:

Coloque las carpetas con versiones x32 y x64 de la biblioteca OpenSSL en los directorios apropiados %programfiles%y %ProgramFiles(x86)%en la PATHvariable de entorno, use una referencia a estas carpetas a través de la %programfiles%variable.

De esta manera, cuando se ejecuta en un entorno de x32 bits, su PATHentrada %programfiles%/OpenSSL/se resolverá automáticamente %ProgramFiles(x86)%/OpenSSL/en un disco.

romka
fuente
1
Bueno, tengo algunos problemas para que funcione. echo %programfiles%muestra una ruta diferente según el tipo de cmd.exe desde el que se ejecuta, pero where ssleay32.dllen ambos tipos de cmd.exe (32 bits y 64 bits) no puedo encontrar este archivo DLL y muestra ¿ INFO: Could not find files for the given pattern(s).Alguna idea?
Piotr Dobrogost
Esto podría ayudar: aunque esto podría ayudar: stackoverflow.com/questions/906310/…
Darokthar
1
si uno de los dlls es de 32 bits, en la máquina de 64 bits debe ir a la carpeta C: \ windows \ syswow64
romka
Esto no funciona para mi. Cuando incluyo% ProgramFiles% en la definición de la variable PATH, no se expande en absoluto, por lo que mi exe no encuentra sus dlls.
Carlos A. Ibarra
7

La respuesta (marcada como correcta) proporcionada por romka es simple y elegante, pero desafortunadamente no funciona (al menos en Windows 7 y Windows 8 de 64 bits, no adelanté mi prueba).

El problema proviene del hecho de que la variable% PATH% del sistema no siempre expande otra variable env: funciona con% SYSTEMDRIVE% por ejemplo, pero desafortunadamente no para% PROGRAMFILES%. Wikipedia sugiere que este comportamiento proviene del nivel de indirección (% SYSTEMDRIVE% no se refiere a una tercera variable env).

La única solución que encontré es usar la magia Redirector del sistema de archivos y los directorios System32 / SysWoW64, como se sugiere en los comentarios.

Para evitar la implementación directa de archivos DLL en el directorio de Windows, que generalmente es difícil de mantener, se puede implementar un enlace suave a un directorio personalizado (funciona en Windows Vista y versiones posteriores de Windows):

Por cierto, perdón por no comentar directamente sobre las publicaciones relevantes: actualmente no tengo suficiente reputación en mi cuenta para hacer esto.

Baptiste Chardon
fuente
5

Sí, es absolutamente posible. Simplemente escriba tres archivos .bat. El primero debería verse así:

@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

El segundo y el tercer archivo .bat son básicamente iguales, excepto que difieren en su nombre. El primero se llamará x86.bat, el segundo ia64.bat y se colocarán en una carpeta llamada bin que se encuentra sobre el primer archivo bat. Tendrás esto:

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

El contenido del segundo y tercer archivo .bat debería verse así:

@set PATH=THE PATH YOU WANT

Puede crear un enlace al primer archivo .bat que tendrá la siguiente configuración:

Objetivo:% comspec% / k "PATH \ first.bat" OPCIÓN | Donde OPTION es x86 o ia64

Comience en: RUTA | Donde PATH es el camino a tu primer.bat

El script es el script simplificado que Microsoft usa para iniciar la línea de comando correcta para su entorno de Visual Studio. Simplemente podría expandir estos scripts a N entornos. Al agregar más archivos .bat para diferentes entornos y al editar first.bat con más opciones y declaraciones goto. Espero que se explique por sí mismo.

Y espero que Microsoft no me demande por usar su script.

EDITAR:

Ah, creo que te he entendido mal un poco. Para la línea cmd de 32 bits, el enlace debe crearse como:

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

EDIT2:

Intenta 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
fuente
1
Es posible que desee corregir eso, solo por claridad, lo más probable es que no estén utilizando la tecnología Intel de 64 bits (ia64 - CPU Itanium) sino más bien la tecnología de bits AMD64, comúnmente conocida como x64.
Multiverse IT
Gracias por tu respuesta. La idea es linda. Sin embargo, estaba buscando alguna solución a nivel de sistema como la utilizada para modificar la %ProgramFiles%variable. (Cita: El% ProgramFiles% en sí mismo depende de si el proceso que solicita la variable de entorno es en sí mismo de 32 bits o de 64 bits (esto es causado por la redirección de Windows-on-Windows de 64 bits). En.wikipedia.org/wiki/ ... )
Piotr Dobrogost
1

Solo quería resumir la respuesta que obtuve siguiendo los enlaces provistos en la respuesta de Baptiste Chardon. Al usar la mklinkherramienta de línea de comandos para crear un enlace simbólico de directorio dentro C:\Windows\system32 y dentro C:\Windows\SysWOW64, cada uno con el mismo nombre (aunque diferentes objetivos), puede agregar el uno C:\Windows\system32a la Pathvariable de entorno. Por ejemplo:

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
usuario74094
fuente
0

He tenido este problema y la respuesta es la siguiente:

La ruta para su variable de sistema en las máquinas de 64 bits es c:\progra~2. Debe tener una ruta sin espacio para su variable de entorno, de lo contrario, el sistema no leerá más C:\programs.

En nuestras máquinas de 32 bits, los programas de empresa variables de entorno son c:\program filesy en los de 64 bits su c:\progra~2. Luego configuramos nuestros atajos para que los usuarios%companyprograms%\...

Puede hacerlo a través de la política de grupo o por script.

JRubinstein
fuente
-1

Como Romka indicó en el seguimiento, la respuesta simple es el directorio SysWOW64.

Afortunadamente, los instaladores de Shining Light productions se encargan de esto por usted. Simplemente ejecute los instaladores de 32 bits y 64 bits y seleccione copiar los .DLL en el directorio "Sistema" de Windows y se elige el directorio apropiado para los .DLL (es decir, los .DLL de 64 bits entran en System32 y los .DLL de 32 bits entran en SysWOW64.

Una vez que hice esto, mis aplicaciones de 32 bits encuentran los .DLL de 32 bits y mis aplicaciones de 64 bits encuentran los .DLL de 64 bits.

etinthelab
fuente