Variabel lingkungan PATH yang berbeda untuk Windows 32bit dan 64bit - apakah mungkin?

14

Apakah mungkin untuk memiliki seluruh atau sebagian PATHvariabel lingkungan yang spesifik untuk jenis gambar proses yang sedang berjalan (32bit / 64bit)? Ketika saya menjalankan beberapa aplikasi dari dalam cmd.exe 64bit saya ingin memilikinya memilih versi 64bit perpustakaan OpenSSL sedangkan ketika saya menjalankan beberapa aplikasi dari dalam cmd.exe 32bit saya ingin memilikinya memilih versi 32bit perpustakaan OpenSSL.

IKUTI
where.exe tidak menemukan lib OpenSSL ketika% ProgramFiles% variabel digunakan dalam variabel lingkungan PATH

Piotr Dobrogost
sumber

Jawaban:

9

Buat %ProgramFiles%untuk %ProgramFiles(x86)%beralih ke variabel yang berfungsi untuk Anda:

Tempat folder dengan x32 dan x64 versi OpenSSL perpustakaan menjadi tepat %programfiles%dan %ProgramFiles(x86)%direktori dan di PATHvariabel lingkungan, menggunakan referensi untuk folder tersebut melalui %programfiles%variabel.

Dengan cara ini, ketika Anda menjalankan dalam lingkungan x32-bit, PATHentri Anda %programfiles%/OpenSSL/akan secara otomatis diselesaikan %ProgramFiles(x86)%/OpenSSL/pada disk.

romka
sumber
1
Yah saya punya beberapa kesulitan untuk membuatnya bekerja. echo %programfiles%menunjukkan jalur yang berbeda tergantung pada jenis cmd.exe yang dijalankannya tetapi where ssleay32.dllpada kedua jenis cmd.exe (32bit dan 64bit) tidak dapat menemukan dll ini dan menampilkan INFO: Could not find files for the given pattern(s).Ada ide?
Piotr Dobrogost
Ini mungkin membantu: Meskipun ini mungkin membantu: stackoverflow.com/questions/906310/…
Darokthar
1
jika salah satu dll adalah 32-bit, pada mesin 64-bit harus masuk ke folder C: \ windows \ syswow64
romka
Ini tidak bekerja untuk saya. Ketika saya memasukkan% ProgramFiles% dalam definisi variabel PATH, itu tidak bisa diperluas sama sekali, jadi exe saya tidak menemukan dllnya.
Carlos A. Ibarra
7

Jawaban (dicentang sebagai benar) yang diberikan oleh romka sederhana dan elegan, tetapi sayangnya tidak bekerja (setidaknya pada Windows 7 dan Windows 8 64 bit, saya tidak mendorong pengujian lebih lanjut).

Masalahnya berasal dari kenyataan bahwa sistem% PATH% variabel tidak selalu memperluas variabel env lainnya: ia bekerja dengan% SYSTEMDRIVE% misalnya, tetapi sayangnya tidak untuk% PROGRAMFILES%. Wikipedia menyarankan bahwa perilaku ini berasal dari tingkat tipuan (% SYSTEMDRIVE% tidak merujuk ke variabel env ketiga).

Satu-satunya solusi yang saya temukan adalah menggunakan sihir File System Redirector dan direktori System32 / SysWoW64, seperti yang disarankan dalam komentar.

Untuk menghindari penyebaran langsung DLL di direktori Windows, yang biasanya sulit dipertahankan, seseorang dapat menggunakan softlink ke direktori kustom (berfungsi pada Windows Vista dan versi Windows yang lebih baru):

Ngomong-ngomong, maaf karena tidak berkomentar langsung pada posting yang relevan: saat ini tidak cukup reputasi di akun saya untuk melakukan ini.

Baptiste Chardon
sumber
5

Ya itu sangat mungkin. Cukup tulis tiga file .bat. Yang pertama akan terlihat seperti ini:

@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

File .bat kedua dan ketiga pada dasarnya sama, kecuali mereka berbeda dalam namanya. Yang pertama akan disebut x86.bat yang kedua ia64.bat dan mereka ditempatkan di folder bernama bin yang berada di atas file bat pertama. Anda akan memiliki ini:

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

Konten file .bat kedua dan ketiga akan terlihat seperti ini:

@set PATH=THE PATH YOU WANT

Anda dapat membuat tautan ke file .bat pertama yang akan memiliki pengaturan berikut:

Target:% comspec% / k "PATH \ first.bat" OPSI | Di mana OPTION adalah x86 atau ia64

Mulai di: PATH | Di mana PATH adalah PATH untuk first.bat Anda

Script adalah skrip yang disederhanakan yang digunakan Microsoft untuk memulai baris perintah yang tepat untuk lingkungan Visual Studio mereka. Anda cukup memperluas skrip ini ke lingkungan N. Dengan menambahkan lebih banyak file .bat untuk lingkungan yang berbeda dan dengan mengedit first.bat dengan lebih banyak opsi dan pernyataan goto. Saya harap ini menjelaskan sendiri.

Dan saya berharap Microsoft tidak menuntut saya karena menggunakan skrip mereka.

EDIT:

Ah saya pikir saya sedikit salah paham. Untuk garis 32bit cmd, tautan harus dibuat sebagai:

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

EDIT2:

Coba sesuatu seperti:

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
sumber
1
Anda mungkin ingin memperbaikinya, hanya untuk kejelasan - kemungkinannya, mereka tidak menggunakan teknologi Intel 64 bit (ia64 - Itanium CPU) melainkan teknologi bit AMD64, yang biasa disebut x64.
Multiverse IT
Terima kasih atas jawaban anda. Idenya bagus. Namun saya sedang mencari beberapa solusi tingkat sistem seperti yang digunakan untuk memodifikasi %ProgramFiles%variabel. (Kutipan:% ProgramFiles% itu sendiri tergantung pada apakah proses yang meminta variabel lingkungan itu sendiri 32-bit atau 64-bit (ini disebabkan oleh pengalihan Windows-on-Windows 64-bit). En.wikipedia.org/wiki/ ... )
Piotr Dobrogost
1

Saya hanya ingin meringkas jawaban yang saya peroleh dengan mengikuti tautan yang disediakan dalam jawaban dari Baptiste Chardon. Dengan menggunakan mklinkalat baris perintah untuk membuat tautan simbolis direktori masuk C:\Windows\system32 dan masuk C:\Windows\SysWOW64, masing-masing memiliki nama yang sama (meskipun target yang berbeda), Anda kemudian dapat menambahkan satu C:\Windows\system32ke Pathvariabel lingkungan. Sebagai contoh:

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
pengguna74094
sumber
0

Saya memiliki masalah ini dan jawabannya adalah sebagai berikut:

Path untuk variabel sistem Anda pada mesin 64 bit adalah c:\progra~2. Anda perlu memiliki jalur tanpa spasi untuk variabel lingkungan Anda, jika tidak, sistem tidak akan membaca lebih jauh dari itu C:\programs.

Pada mesin 32 bit kami, program perusahaan variabel lingkungan c:\program filesdan pada yang 64 bit c:\progra~2. Kami kemudian mengatur pintasan untuk pengguna%companyprograms%\...

Anda dapat melakukannya melalui kebijakan grup atau dengan skrip.

JRubinstein
sumber
-1

Seperti yang ditunjukkan romka dalam tindak lanjut, jawaban sederhana adalah direktori SysWOW64.

Untungnya installer dari produksi Shining Light mengurus ini untuk Anda. Jalankan saja penginstal 32bit dan 64bit dan pilih untuk menyalin .DLL ke dalam direktori "Sistem" Window dan direktori yang tepat dipilih untuk .DLL (yaitu 64bit .DLL masuk ke System32 dan 32bit .DLL masuk ke SysWOW64.

Setelah saya melakukan ini, aplikasi 32bit saya menemukan 32bit. DLL dan aplikasi 64bit saya menemukan 64bit. DLL.

etinthelab
sumber