Різна змінна середовища PATH для 32-бітних та 64-бітних Windows - це можливо?


14

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

НАСТУПНІ
where.exe не знаходить OpenSSL LIBS , коли% ProgramFiles% змінна використовується в змінної PATH середовища

Відповіді:


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).будь-які ідеї?
Пьотр Доброгост

Це може допомогти: Altough це може допомогти: stackoverflow.com/questions/906310 / ...
Darokthar

1
якщо один з dll є 32-розрядним, на 64-бітній машині він повинен перейти в папку C: \ windows \ syswow64
romka

Це не працює для мене. Коли я включаю% ProgramFiles% у визначення змінної PATH, він зовсім не розширюється, тому мій exe не знаходить своїх dlls.
Карлос А. Ібарра

7

Відповідь (перевірена правильно), надана romka, проста і елегантна, але, на жаль, не працює (принаймні, для Windows 7 та Windows 8 64 біт, я не просував свій тест далі).

Проблема випливає з того, що системна змінна% PATH% не завжди розширює іншу змінну env: вона працює, наприклад, з% SYSTEMDRIVE%, але, на жаль, не для% PROGRAMFILES%. Вікіпедія припускає, що така поведінка походить від рівня непрямості (% SYSTEMDRIVE% не посилається на третю змінну env).

Єдине знайдене нами рішення - використовувати магію File System Redirector та каталоги 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 | Там, де 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

1
Ви можете виправити це, тільки для наочності - шанси є, що вони використовують не 64-бітну технологію Intel (ia64 - процесори Itanium), а швидше AMD64-бітну технологію, яку зазвичай називають x64.
Мультиверс 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

0

У мене була ця проблема, і відповідь така:

Шлях для вашої системної змінної на 64-бітних машинах є c:\progra~2. Потрібно мати простір для своєї змінної середовища, інакше система не буде читати далі C:\programs.

На наших 32-бітних машинах середовище мінливої ​​програмою компанії є, c:\program filesа на 64-бітних - її c:\progra~2. Потім ми встановлюємо наші ярлики для користувачів%companyprograms%\...

Це можна зробити за допомогою групової політики або за сценарієм.


-1

Як зазначено в наступному описі romka, простою відповіддю є каталог SysWOW64.

На щастя, про це подбають монтажі виробників Shining Light . Просто запустіть 32-бітні та 64-бітні інсталятори та виберіть для копіювання.

Як тільки я зробив це, мої 32-бітні програми знаходять 32-бітні .DLL, а мої 64-бітні програми знаходять 64-бітні .DLL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.