Variabile d'ambiente PATH diversa per Windows a 32 e 64 bit - è possibile?


14

È possibile avere l'intera o parte della PATHvariabile d' ambiente specifica per il tipo di immagine del processo in esecuzione (32 bit / 64 bit)? Quando eseguo alcune app da cmd.exe a 64 bit, vorrei che selezionasse la versione a 64 bit della libreria OpenSSL, mentre quando eseguivo un'applicazione da cmd.exe a 32 bit, vorrei che selezionassi la versione a 32 bit della libreria OpenSSL.

FOLLOW UP
dove.exe non trova le librerie OpenSSL quando viene utilizzata la variabile% ProgramFiles% nella variabile di ambiente PATH

Risposte:


9

Fai %ProgramFiles%in modo che %ProgramFiles(x86)%env passi al funzionamento per te:

Posizionare le cartelle con le versioni x32 e x64 della libreria OpenSSL in appropriate %programfiles%e nelle %ProgramFiles(x86)%directory e nella PATHvariabile d'ambiente, utilizzare un riferimento a queste cartelle tramite la %programfiles%variabile.

In questo modo, quando si esegue in ambiente x32-bit, la PATHvoce %programfiles%/OpenSSL/verrà automaticamente risolta %ProgramFiles(x86)%/OpenSSL/su un disco.


1
Beh, ho qualche problema a farlo funzionare. echo %programfiles%mostra un percorso diverso a seconda del tipo di cmd.exe da cui è eseguito ma where ssleay32.dllin entrambi i tipi di cmd.exe (32 bit e 64 bit) non è possibile trovare questa dll e visualizza INFO: Could not find files for the given pattern(s).idee?
Piotr Dobrogost,

Questo aiuto potrebbe: Benche Questo potrebbe aiutare: stackoverflow.com/questions/906310/...
Darokthar

1
se una delle DLL è a 32 bit, sulla macchina a 64 bit dovrebbe andare nella cartella C: \ windows \ syswow64
romka,

Questo non funziona per me. Quando includo% ProgramFiles% nella definizione della variabile PATH, non viene affatto espanso, quindi il mio exe non trova le sue dll.
Carlos A. Ibarra,

7

La risposta (selezionata come corretta) fornita da Romka è semplice ed elegante, ma sfortunatamente non funziona (almeno su Windows 7 e Windows 8 64 bit, non ho spinto oltre il mio test).

Il problema deriva dal fatto che la variabile di sistema% PATH% non espande sempre altre variabili env: ad esempio funziona con% SYSTEMDRIVE%, ma sfortunatamente non per% PROGRAMFILES%. Wikipedia suggerisce che questo comportamento proviene dal livello di riferimento indiretto (% SYSTEMDRIVE% non si riferisce a una terza variabile env).

L'unica soluzione che ho trovato è quella di utilizzare la magia Redirector del file system e le directory System32 / SysWoW64, come suggerito nei commenti.

Per evitare la distribuzione diretta di DLL nella directory di Windows, che di solito è difficile da mantenere, è possibile distribuire invece un softlink in una directory personalizzata (funziona su Windows Vista e versioni successive di Windows):

A proposito, mi dispiace per non aver commentato direttamente i post pertinenti: attualmente non abbastanza reputazione sul mio account per farlo.


5

Sì, è assolutamente possibile. Basta scrivere tre file .bat. Il primo dovrebbe apparire così:

@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

Il secondo e il terzo file .bat sono sostanzialmente gli stessi, tranne per il fatto che differiscono nel loro nome. Il primo si chiamerà x86.bat il secondo ia64.bat e saranno collocati in una cartella chiamata bin che si trova sopra il primo file bat. Avrai questo:

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

Il contenuto del secondo e terzo file .bat dovrebbe essere simile al seguente:

@set PATH=THE PATH YOU WANT

È possibile creare un collegamento al primo file .bat che avrà le seguenti impostazioni:

Target:% comspec% / k OPZIONE "PATH \ first.bat" | Dove OPTION è x86 o ia64

Inizia in: PERCORSO | Dove PATH è il PATH per il tuo first.bat

Lo script è lo script semplificato che Microsoft utilizza per avviare la riga di comando corretta per il loro ambiente Visual Studio. Potresti semplicemente espandere questi script in N ambienti. Aggiungendo più file .bat per ambienti diversi e modificando first.bat con più opzioni e istruzioni goto. Spero sia autoesplicativo.

E spero che Microsoft non mi faccia causa per aver usato la sua sceneggiatura.

MODIFICARE:

Ah, penso di averti frainteso un po '. Per la linea cmd a 32 bit, il collegamento deve essere creato come:

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

EDIT2:

Prova qualcosa del tipo:

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
Potresti voler correggere questo, solo per chiarezza - le probabilità sono, non stanno usando la tecnologia Intel 64 bit (ia64 - CPU Itanium) ma piuttosto la tecnologia AMD64 bit, comunemente chiamata x64.
Multiverso IT

Grazie per la tua risposta. L'idea è carina Tuttavia stavo cercando una soluzione a livello di sistema come quella usata per modificare la %ProgramFiles%variabile. (Quote:% ProgramFiles% stesso dipende dal fatto che il processo che richiede la variabile di ambiente sia esso stesso a 32 bit o 64 bit (questo è causato dal reindirizzamento Windows-on-Windows a 64 bit). En.wikipedia.org/wiki/ ... )
Piotr Dobrogost,

1

Volevo solo riassumere la risposta che ho ottenuto seguendo i link forniti nella risposta di Baptiste Chardon. Utilizzando lo mklinkstrumento da riga di comando per creare un collegamento simbolico di directory in C:\Windows\system32 e in C:\Windows\SysWOW64, ciascuno con lo stesso nome (anche se target diversi), è possibile aggiungere semplicemente quello C:\Windows\system32alla Pathvariabile di ambiente. Per esempio:

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

Ho avuto questo problema e la risposta è la seguente:

Il percorso per la variabile di sistema sui computer a 64 bit è c:\progra~2. Devi avere un percorso senza spazi per la tua variabile ambientale, altrimenti il ​​sistema non leggerà oltre C:\programs.

Sulle nostre macchine a 32 bit i programmi aziendali variabili d'ambiente sono c:\program filese su quelli a 64 bit sono c:\progra~2. Quindi impostiamo le nostre scorciatoie per gli utenti%companyprograms%\...

Puoi farlo tramite criteri di gruppo o tramite script.


-1

Come indicato da romka nel seguito, la risposta semplice è la directory SysWOW64.

Fortunatamente gli installatori delle produzioni Shining Light si prendono cura di questo per te. Basta eseguire i programmi di installazione a 32 e 64 bit e selezionare per copiare i .DLL nella directory "Sistema" di Windows e viene scelta la directory corretta per i .DLL (ovvero i .DLL a 64 bit vanno in System32 e i .DLL a 32 bit in SysWOW64.

Una volta fatto questo, le mie app a 32 bit trovano i .DLL a 32 bit e le mie app a 64 bit trovano i .DLL a 64 bit.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.