14

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

СЛЕДОВАТЬ ЗА
where.exe не находит библиотеки OpenSSL, когда в переменной среды PATH используется переменная% ProgramFiles%

6 ответов6

9

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

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

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

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" ОПЦИЯ | Где OPTION x86 или ia64

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

Сценарий - это упрощенный сценарий, который 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
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
0

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

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

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

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

-1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .