web-dev-qa-db-fra.com

Variable d’environnement PATH pour Windows 32 bits et 64 bits - est-ce possible?

Est-il possible d'avoir tout ou partie de la variable d'environnement PATH spécifique au type d'image du processus en cours d'exécution (32 bits/64 bits)? Lorsque j'exécute une application dans cmd.exe de 64 bits, j'aimerais qu'il choisisse la version 64 bits de la bibliothèque OpenSSL, alors que lorsque je lance une application dans les 32 bits, cmd.exe, j'aimerais qu'il choisisse la version 32 bits de la bibliothèque OpenSSL.

SUIVI
where.exe ne trouve pas les bibliothèques OpenSSL lorsque la variable% ProgramFiles% est utilisée dans la variable d'environnement PATH

14
Piotr Dobrogost

Faites passer la variable %ProgramFiles% à %ProgramFiles(x86)% env pour fonctionner pour vous:

Placez les dossiers avec les versions x32 et x64 de la bibliothèque OpenSSL dans les répertoires appropriés %programfiles% et %ProgramFiles(x86)%. Dans la variable d'environnement PATH, utilisez une référence à ces dossiers via la variable %programfiles%.

Ainsi, lorsque vous utilisez l'environnement x32-bit, votre entrée PATH%programfiles%/OpenSSL/ sera automatiquement résolue en %ProgramFiles(x86)%/OpenSSL/ sur un disque.

9
romka

La réponse (cochée à droite) fournie par romka est simple et élégante, mais ne fonctionne malheureusement pas (du moins sur Windows 7 et Windows 8 64 bits, je n’ai pas poussé plus loin mon test).

Le problème vient du fait que la variable système% PATH% ne développe pas toujours les autres variables env: elle fonctionne avec% SYSTEMDRIVE% par exemple, mais malheureusement pas pour% PROGRAMFILES%. Wikipedia suggère que ce comportement provient du niveau d'indirection (% SYSTEMDRIVE% ne fait pas référence à une troisième variable env).

La seule solution que j'ai trouvée consiste à utiliser la magie File Redirector et les répertoires System32/SysWoW64, comme suggéré dans les commentaires.

Pour éviter le déploiement direct de DLL dans le répertoire Windows, ce qui est généralement difficile à gérer, vous pouvez déployer un lien symbolique vers un répertoire personnalisé (fonctionne sous Windows Vista et les versions ultérieures de Windows):

Au fait, désolé de ne pas avoir commenté directement sur les posts concernés: actuellement, la réputation de mon compte est insuffisante pour le faire.

7
Baptiste Chardon

Oui c'est absolument possible. Écrivez simplement trois fichiers .bat. Le premier devrait ressembler à ceci:

@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

Les deuxième et troisième fichiers .bat sont fondamentalement les mêmes, sauf qu'ils diffèrent par leur nom. Le premier s'appellera x86.bat et le second ia64.bat. Ils seront placés dans un dossier appelé bin, situé au-dessus du premier fichier bat. Vous aurez ceci:

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

Le contenu des deuxième et troisième fichiers .bat devrait ressembler à ceci:

@set PATH=THE PATH YOU WANT

Vous pouvez créer un lien vers le premier fichier .bat avec les paramètres suivants:

Cible:% comspec%/k "PATH\first.bat" OPTION | Où OPTION est x86 ou ia64

Commencez par: PATH | Où PATH est le PATH de votre premier .bat

Le script est le script simplifié utilisé par Microsoft pour démarrer la ligne de commande appropriée pour leur environnement Visual Studio. Vous pouvez simplement étendre ces scripts à N environnements. En ajoutant plus de fichiers .bat pour différents environnements et en modifiant le fichier first.bat avec plus d'options et d'instructions goto. J'espère que ça s'explique de soi.

Et j'espère que Microsoft ne me poursuivra pas en justice pour l'utilisation de leur script.

MODIFIER:

Ah je pense que je vous ai un peu mal compris. Pour la ligne de commande 32 bits, le lien doit être créé comme suit:

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

EDIT2:

Essayez quelque chose comme:

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
5
Darokthar

Je voulais juste résumer la réponse obtenue en suivant les liens fournis dans la réponse de Baptiste Chardon. En utilisant l'outil de ligne de commande mklink pour créer un lien symbolique de répertoire dans C:\Windows\system32 et dans C:\Windows\SysWOW64, chacun portant le même nom (bien que différentes cibles), vous pouvez ensuite simplement ajouter celui dans C:\Windows\system32 à la variable d'environnement Path. Par exemple:

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
1
user74094

J'ai eu ce problème et la réponse est la suivante:

Le chemin d'accès à votre variable système sur les ordinateurs 64 bits est c:\progra~2. Vous devez avoir un chemin sans espace pour votre variable d'environnement, sinon le système ne lira pas plus que C:\programs.

Sur nos machines 32 bits, la variable d’environnement companyprograms est c:\program files et sur les machines 64 bits son c:\progra~2. Nous avons ensuite défini nos raccourcis pour les utilisateurs sur %companyprograms%\...

Vous pouvez le faire via une stratégie de groupe ou par script.

0
JRubinstein