Variable d'environnement PATH différente pour Windows 32 bits et 64 bits - est-ce possible?

14

Est-il possible d'avoir tout ou partie de PATHla variable d'environnement spécifique au type d'image du processus en cours (32bit / 64bit)? Lorsque j'exécute une application à partir de cmd.exe 64 bits, je voudrais qu'elle choisisse la version 64 bits de la bibliothèque OpenSSL, tandis que lorsque j'exécute une application à partir de cmd.exe 32 bits, je voudrais qu'elle choisisse la version 32 bits de la bibliothèque OpenSSL.

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

Piotr Dobrogost
la source

Réponses:

9

Faites %ProgramFiles%en %ProgramFiles(x86)%sorte que la commutation de variables env fonctionne 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 PATHvariable d'environnement, utilisez une référence à ces dossiers via la %programfiles%variable.

De cette façon, lorsque vous exécutez dans un environnement x32 bits, votre PATHentrée %programfiles%/OpenSSL/sera automatiquement résolue %ProgramFiles(x86)%/OpenSSL/sur un disque.

romka
la source
1
Eh bien, j'ai du mal à le faire fonctionner. echo %programfiles%affiche un chemin différent selon le type de cmd.exe à partir duquel il est exécuté, mais where ssleay32.dlldans les deux types de cmd.exe (32 bits et 64 bits), vous ne pouvez pas trouver cette DLL et affiche des INFO: Could not find files for the given pattern(s).idées?
Piotr Dobrogost
Cela pourrait aider: Cela pourrait également aider: stackoverflow.com/questions/906310/…
Darokthar
1
si l'une des DLL est 32 bits, sur une machine 64 bits, elle devrait aller dans le dossier C: \ windows \ syswow64
romka
Cela ne fonctionne pas pour moi. Lorsque j'inclus% ProgramFiles% dans la définition de la variable PATH, il ne se développe pas du tout, donc mon exe ne trouve pas ses DLL.
Carlos A. Ibarra
7

La réponse (cochée à droite) fournie par romka est simple et élégante, mais ne fonctionne malheureusement pas (au 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 vient du niveau d'indirection (% SYSTEMDRIVE% ne fait pas référence à une troisième variable env).

La seule solution que j'ai trouvée est d'utiliser la magie du redirecteur de système de fichiers 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, qui est généralement difficile à maintenir, on peut déployer à la place un lien logiciel vers un répertoire personnalisé (fonctionne sur Windows Vista et les versions ultérieures de Windows):

Soit dit en passant, désolé de ne pas avoir commenté directement les messages pertinents: actuellement pas assez de réputation sur mon compte pour ce faire.

Baptiste Chardon
la source
5

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

Le deuxième et le troisième fichier .bat sont fondamentalement les mêmes, sauf qu'ils diffèrent par leur nom. Le premier sera appelé x86.bat le second ia64.bat et ils sont placés dans un dossier appelé bin qui se trouve 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 qui aura les paramètres suivants:

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

Début dans: CHEMIN | Où PATH est le CHEMIN vers votre first.bat

Le script est le script simplifié que Microsoft utilise pour démarrer la bonne ligne de commande 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 éditant le premier.bat avec plus d'options et d'instructions goto. J'espère que ça s'explique.

Et j'espère que Microsoft ne me poursuivra pas pour avoir utilisé leur script.

ÉDITER:

Ah je pense que je vous ai un peu mal compris. Pour la ligne cmd 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
Darokthar
la source
1
Vous voudrez peut-être corriger cela, juste pour plus de clarté - il y a de fortes chances qu'ils n'utilisent pas la technologie Intel 64 bits (ia64 - processeurs Itanium) mais plutôt la technologie AMD64 bits, communément appelée x64.
Multiverse IT
Merci pour votre réponse. L'idée est sympa. Cependant, je cherchais une solution au niveau du système comme celle utilisée pour modifier la %ProgramFiles%variable. (Quote: Le% ProgramFiles% lui-même dépend si le processus demandant la variable d'environnement est lui-même 32 bits ou 64 bits (cela est dû à la redirection Windows 64 bits sur Windows). En.wikipedia.org/wiki/ … )
Piotr Dobrogost le
1

Je voulais juste résumer la réponse que j'ai obtenue en suivant les liens fournis dans la réponse de Baptiste Chardon. En utilisant l' mklinkoutil de ligne de commande pour créer un lien symbolique de répertoire vers C:\Windows\system32 et depuis C:\Windows\SysWOW64, chacun ayant le même nom (bien que des cibles différentes), vous pouvez ensuite simplement ajouter celui-ci C:\Windows\system32à la Pathvariable d'environnement. 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
user74094
la source
0

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

Le chemin de votre variable système sur les machines 64 bits est c:\progra~2. Vous devez avoir un chemin sans espace pour votre variable environnementale, sinon le système ne lira pas plus loin C:\programs.

Sur nos machines 32 bits, les programmes d'entreprise variables d'environnement sont c:\program fileset sur ceux 64 bits, c'est c:\progra~2. Nous définissons ensuite nos raccourcis pour les utilisateurs sur%companyprograms%\...

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

JRubinstein
la source
-1

Comme romka l'a indiqué dans le suivi, la réponse simple est le répertoire SysWOW64.

Heureusement, les installateurs de Shining Light productions s'en occupent pour vous. Il suffit d'exécuter les programmes d'installation 32 bits et 64 bits et de choisir de copier les .DLL dans le répertoire "System" de la fenêtre et le répertoire approprié est choisi pour les .DLL (c'est-à-dire que les 64 bits .DLL vont dans System32 et les 32 bits .DLL vont dans SysWOW64.

Une fois que j'ai fait cela, mes applications 32 bits trouvent les .DLL 32 bits et mes applications 64 bits trouvent les .DLL 64 bits.

etinthelab
la source