Unterschiedliche PATH-Umgebungsvariable für 32-Bit- und 64-Bit-Windows - ist das möglich?

14

Ist es möglich, PATHUmgebungsvariablen ganz oder teilweise zu haben , die für den Typ des Images des laufenden Prozesses spezifisch sind (32-Bit / 64-Bit)? Wenn ich eine App in 64bit cmd.exe starte, möchte ich, dass sie die 64bit-Version der OpenSSL-Bibliothek auswählt. Wenn ich eine App in 32bit cmd.exe starte, möchte ich, dass sie die 32bit-Version der OpenSSL-Bibliothek auswählt.

FOLLOW UP
where.exe findet keine OpenSSL-Bibliotheken, wenn die Variable% ProgramFiles% in der Umgebungsvariablen PATH verwendet wird

Piotr Dobrogost
quelle

Antworten:

9

Machen Sie %ProgramFiles%zu %ProgramFiles(x86)%für Sie variable Schalt zur Arbeit env:

Platz Ordner mit x32 und x64 - Versionen von OpenSSL - Bibliothek in geeigneten %programfiles%und %ProgramFiles(x86)%Verzeichnisse und in der PATHUmgebungsvariable, verwenden Sie einen Verweis auf diesen Ordner über die %programfiles%Variable.

Auf diese Weise wird Ihr PATHEintrag in einer x32-Bit-Umgebung %programfiles%/OpenSSL/automatisch %ProgramFiles(x86)%/OpenSSL/auf eine Festplatte aufgelöst.

romka
quelle
1
Nun, ich habe einige Probleme damit, es zum Laufen zu bringen. echo %programfiles%zeigt je nach cmd.exe-Typ einen anderen Pfad an, aber where ssleay32.dllin beiden cmd.exe-Typen (32-Bit und 64-Bit) wird diese DLL nicht gefunden, und es werden INFO: Could not find files for the given pattern(s).Ideen angezeigt ?
Piotr Dobrogost
Dies könnte helfen: Auch wenn dies helfen könnte: stackoverflow.com/questions/906310/…
Darokthar
1
wenn einer des dlls ein 32-Bit ist, auf 64-Bit - Maschine sollte in C gehen: \ windows \ syswow64 Ordner
romka
Das funktioniert bei mir nicht. Wenn ich% ProgramFiles% in die PATH-Variablendefinition einbinde, wird es überhaupt nicht erweitert, sodass meine Exe ihre DLLs nicht findet.
Carlos A. Ibarra
7

Die Antwort (als richtig markiert) von romka ist einfach und elegant, funktioniert aber leider nicht (zumindest unter Windows 7 und Windows 8 64-Bit habe ich meinen Test nicht weiter vorangetrieben).

Das Problem ergibt sich aus der Tatsache, dass die Systemvariable% PATH% nicht immer eine andere Umgebungsvariable erweitert: Sie funktioniert beispielsweise mit% SYSTEMDRIVE%, aber leider nicht mit% PROGRAMFILES%. Wikipedia schlägt vor, dass dieses Verhalten von der Indirektionsebene herrührt (% SYSTEMDRIVE% verweist nicht auf eine dritte env-Variable).

Die einzige Lösung, die ich gefunden habe, ist die Verwendung von File System Redirector Magic und der Verzeichnisse System32 / SysWoW64, wie in den Kommentaren vorgeschlagen.

Um die direkte Bereitstellung von DLLs im Windows-Verzeichnis zu vermeiden, die normalerweise schwer zu warten ist, kann stattdessen ein Softlink zu einem benutzerdefinierten Verzeichnis bereitgestellt werden (funktioniert unter Windows Vista und späteren Versionen von Windows):

Übrigens, es tut uns leid, dass ich die relevanten Beiträge nicht direkt kommentiert habe: Momentan ist in meinem Konto nicht genug Ruf, um dies zu tun.

Baptiste Chardon
quelle
5

Ja, das ist absolut möglich. Schreiben Sie einfach drei .bat-Dateien. Der erste sollte so aussehen:

@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

Die zweite und die dritte .bat-Datei sind grundsätzlich identisch, außer dass sie sich in ihrem Namen unterscheiden. Die erste Datei heißt x86.bat und die zweite ia64.bat. Sie wird in einem Ordner namens bin abgelegt, der über der ersten bat-Datei liegt. Sie werden folgendes haben:

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

Der Inhalt der zweiten und dritten .bat-Datei sollte folgendermaßen aussehen:

@set PATH=THE PATH YOU WANT

Sie können einen Link zur ersten .bat-Datei erstellen, die die folgenden Einstellungen enthält:

Ziel:% comspec% / k OPTION "PATH \ first.bat" | Wobei OPTION x86 oder ia64 ist

Start in: PFAD | Wobei PFAD der PFAD zu Ihrer first.bat ist

Das Skript ist das vereinfachte Skript, mit dem Microsoft die richtige Befehlszeile für die Visual Studio-Umgebung startet. Sie können diese Skripte einfach auf N Umgebungen erweitern. Indem Sie mehr .bat-Dateien für verschiedene Umgebungen hinzufügen und die first.bat mit mehr Optionen und goto-Anweisungen bearbeiten. Ich hoffe es ist selbsterklärend.

Und ich hoffe, Microsoft verklagt mich nicht für die Verwendung ihres Skripts.

BEARBEITEN:

Ah, ich glaube, ich habe dich ein bisschen missverstanden. Für die 32-Bit-Cmd-Zeile sollte der Link wie folgt erstellt werden:

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

EDIT2:

Versuchen Sie etwas wie:

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
quelle
1
Vielleicht möchten Sie dies aus Gründen der Klarheit korrigieren - die Chancen stehen gut, dass sie nicht die Intel 64-Bit-Technologie (ia64-Itanium-CPUs) verwenden, sondern die AMD64-Bit-Technologie, die allgemein als x64 bezeichnet wird.
Multiverse IT
Danke für deine Antwort. Die Idee ist nett. Ich suchte jedoch nach einer Lösung auf Systemebene, wie sie zum Ändern von %ProgramFiles%Variablen verwendet wird. (Zitat:% ProgramFiles% selbst hängt davon ab, ob der Prozess, der die Umgebungsvariable anfordert, selbst 32-Bit- oder 64-Bit-Version ist (dies wird durch die Windows-auf-Windows-64-Bit-Umleitung verursacht). En.wikipedia.org/wiki/ … )
Piotr Dobrogost
1

Ich wollte nur die Antwort zusammenfassen, die ich erhalten habe, indem ich den Links in der Antwort von Baptiste Chardon gefolgt bin . Wenn Sie mit dem mklinkBefehlszeilentool eine symbolische Verzeichnisverknüpfung in C:\Windows\system32 und in erstellen C:\Windows\SysWOW64, die jeweils denselben Namen haben (jedoch unterschiedliche Ziele haben), können Sie die Verknüpfung einfach C:\Windows\system32der PathUmgebungsvariablen hinzufügen . Beispielsweise:

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
quelle
0

Ich hatte dieses Problem und die Antwort lautet wie folgt:

Der Pfad für Ihre Systemvariable auf den 64-Bit-Computern lautet c:\progra~2. Sie benötigen einen raumlosen Pfad für Ihre Umgebungsvariable, sonst liest das System nicht weiter alsC:\programs .

Auf unseren 32-Bit-Rechnern sind die Umgebungsvariablen c:\program filesund auf den 64-Bit- Rechnern die Firmenprogramme c:\progra~2. Wir setzen dann unsere Verknüpfungen für Benutzer auf%companyprograms%\...

Sie können dies über Gruppenrichtlinien oder per Skript tun.

JRubinstein
quelle
-1

Wie romka in der Folge angedeutet hat, ist die einfache Antwort das SysWOW64-Verzeichnis.

Zum Glück die Installer von Shining Light Produktionen kümmern sich für Sie darum. Führen Sie einfach die 32-Bit- und 64-Bit-Installationsprogramme aus und kopieren Sie die DLLs in das Windows-Verzeichnis "System". Für die DLLs wird das richtige Verzeichnis ausgewählt (dh die 64-Bit-DLLs werden in System32 und die 32-Bit-DLLs in SysWOW64 gespeichert).

Sobald ich dies getan hatte, finden meine 32-Bit-Apps die 32-Bit-DLLs und meine 64-Bit-Apps die 64-Bit-DLLs.

etinthelab
quelle