Различные переменные среды PATH для 32-битной и 64-битной Windows - возможно ли это?

14

Можно ли иметь всю или часть PATHпеременной среды, специфичной для типа образа запущенного процесса (32-бит / 64-бит)? Когда я запускаю какое-то приложение из 64-битного cmd.exe, я хотел бы, чтобы оно выбирало 64-битную версию библиотеки OpenSSL, тогда как когда я запускаю какое-то приложение из 32-битного cmd.exe, я хотел бы, чтобы оно выбирало 32-битную версию библиотеки OpenSSL.

FOLLOW UP
где.exe не находит библиотеки OpenSSL, когда в переменной среды PATH используется переменная% ProgramFiles%

Петр Доброгост
источник

Ответы:

9

Сделайте так, %ProgramFiles%чтобы %ProgramFiles(x86)%переменные env работали на вас:

Место папка с x32 и x64 версии библиотеки OpenSSL в соответствующие %programfiles%и %ProgramFiles(x86)%каталоги , а в PATHпеременной среде, используйте ссылку на эти папки через %programfiles%переменный.

Таким образом, когда вы работаете в x32-битной среде, ваша PATHзапись %programfiles%/OpenSSL/будет автоматически разрешена %ProgramFiles(x86)%/OpenSSL/на диске.

Ромка
источник
1
Ну, у меня возникли проблемы с тем, чтобы заставить его работать. echo %programfiles%показывает разные пути в зависимости от типа cmd.exe, из которого он запущен, но where ssleay32.dllв обоих типах cmd.exe (32-битный и 64-битный) не может найти эту DLL и отображает INFO: Could not find files for the given pattern(s).какие-либо идеи?
Петр Доброгост
Это может помочь: хотя это может помочь: stackoverflow.com/questions/906310/…
Darokthar
1
если одна из библиотек является 32-разрядной, на 64-разрядной машине она должна находиться в папке C: \ windows \ syswow64
romka
Это не работает для меня. Когда я включаю% ProgramFiles% в определение переменной PATH, он вообще не раскрывается, поэтому мой exe не находит его dll.
Карлос А. Ибарра
7

Ответ (проверенный как правильный), предоставленный romka, прост и элегантен, но, к сожалению, не работает (по крайней мере, в Windows 7 и Windows 8 64 бит, я не продвинул свой тест дальше).

Проблема заключается в том, что системная переменная% PATH% не всегда раскрывает другую переменную env: она работает, например, с% SYSTEMDRIVE%, но, к сожалению, не с% PROGRAMFILES%. Википедия предполагает, что это поведение происходит от уровня косвенности (% SYSTEMDRIVE% не относится к третьей переменной env).

Единственное решение, которое я нашел, - это использование магии перенаправителя файловой системы и каталогов System32 / SysWoW64, как предлагается в комментариях.

Чтобы избежать прямого развертывания библиотек DLL в каталоге Windows, который обычно сложно поддерживать, вместо этого можно развернуть программную ссылку на пользовательский каталог (работает в Windows Vista и более поздних версиях Windows):

Кстати, извините за то, что не комментировал непосредственно соответствующие посты: в настоящее время на моем аккаунте недостаточно репутации, чтобы сделать это.

Баптист Шардон
источник
5

Да, это абсолютно возможно. Просто напишите три .bat файла. Первый должен выглядеть так:

@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

Второй и третий файл .bat в основном одинаковы, за исключением того, что они различаются по имени. Первый будет называться x86.bat, второй - ia64.bat, и они будут помещены в папку bin, которая находится над первым файлом bat. У вас будет это:

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

Содержимое второго и третьего файла .bat должно выглядеть так:

@set PATH=THE PATH YOU WANT

Вы можете создать ссылку на первый файл .bat, который будет иметь следующие настройки:

Цель:% comspec% / k "PATH \ first.bat" ОПЦИЯ | Где опция - x86 или ia64

Начало в: ПУТЬ | Где PATH - это путь к вашему first.bat

Сценарий - это упрощенный сценарий, который Microsoft использует для запуска правильной командной строки для своей среды Visual Studio. Вы можете просто расширить эти сценарии для N сред. Добавляя больше .bat файлов для разных сред и редактируя first.bat с большим количеством опций и операторов goto. Я надеюсь, что это само за себя.

И я надеюсь, что Microsoft не предъявляет мне иск за использование их сценария.

РЕДАКТИРОВАТЬ:

Ах, я думаю, что я вас немного не понял. Для 32-битной строки cmd ссылка должна быть создана как:

Цель:% windir% \ SysWoW64 \ cmd.exe "PATH \ first.bat" x86

EDIT2:

Попробуйте что-то вроде:

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
источник
1
Возможно, вы захотите исправить это, просто для ясности: скорее всего, они используют не 64-разрядную технологию Intel (ia64 - процессоры Itanium), а скорее 64-разрядную технологию AMD, обычно называемую x64.
Multiverse IT
Спасибо за Ваш ответ. Идея хорошая. Однако я искал какое-то решение системного уровня, подобное тому, которое использовалось для изменения %ProgramFiles%переменной. (Цитата:% ProgramFiles% сам зависит от того, является ли процесс, запрашивающий переменную среды, самим 32-разрядным или 64-разрядным (это вызвано 64-разрядным перенаправлением Windows-on-Windows). En.wikipedia.org/wiki/ … )
Петр Доброгост
1

Я хотел просто суммировать ответ, который я получил, перейдя по ссылкам, приведенным в ответе от Батиста Шардона. Используя mklinkинструмент командной строки для создания каталога символической ссылки в C:\Windows\system32 и в C:\Windows\SysWOW64, каждый из которых имеет такое же имя (хотя разные цели), вы можете просто добавить один в C:\Windows\system32к Pathпеременному окружению. Например:

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
источник
0

У меня была эта проблема, и ответ таков:

Путь к вашей системной переменной на 64 - битных машин c:\progra~2. У вас должен быть свободный путь для вашей переменной среды, иначе система не будет читать дальше C:\programs.

На наших 32-битных машинах переменная окружения companyprograms есть, c:\program filesа на 64-битных - ее c:\progra~2. Затем мы устанавливаем наши ярлыки для пользователей%companyprograms%\...

Вы можете сделать это через групповую политику или по сценарию.

JRubinstein
источник
-1

Как указывает romka в последующем, простой ответ - это каталог SysWOW64.

К счастью, инсталляторы от Shining Light позаботятся об этом за вас. Просто запустите 32-битные и 64-битные установщики и выберите, чтобы скопировать файлы .DLL в каталог «System» окна, и для файлов .DLL будет выбран правильный каталог (т. Е. 64-битные файлы .DLL попадают в System32, а 32-битные файлы .DLL попадают в SysWOW64.

После этого мои 32-битные приложения находят 32-битные .DLL, а мои 64-битные приложения - 64-битные .DLL.

etinthelab
источник