ตัวแปรสภาพแวดล้อม PATH แตกต่างกันสำหรับ Windows แบบ 32 บิตและ 64 บิตเป็นไปได้หรือไม่


14

เป็นไปได้หรือไม่ที่จะมีPATHตัวแปรสภาพแวดล้อมทั้งหมดหรือบางส่วนที่เฉพาะเจาะจงกับประเภทของอิมเมจของกระบวนการทำงาน (32 บิต / 64 บิต)? เมื่อฉันเรียกใช้แอพบางตัวจากภายใน 64 บิต cmd.exe ฉันต้องการให้มันเลือกไลบรารี่ OpenSSL เวอร์ชัน 64 บิตในขณะที่เมื่อฉันรันแอพบางตัวจากภายใน 32 บิต cmd.exe ฉันต้องการให้มันเลือกไลบรารี่ OpenSSL เวอร์ชัน 32 บิต

ทำตาม
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).ความคิดเห็นใด ๆ
Piotr Dobrogost

สิ่งนี้อาจช่วยได้: สิ่งนี้อาจช่วยได้มาก: stackoverflow.com/questions/906310/…
Darokthar

1
หากหนึ่งใน Dll เป็น 32- บิตบนเครื่อง 64- บิตมันควรจะเข้าไปในโฟลเดอร์ C: \ windows \ syswow64
romka

สิ่งนี้ไม่ได้ผลสำหรับฉัน เมื่อฉันรวม% ProgramFiles% ในคำนิยามตัวแปร PATH มันไม่ได้รับการขยายเลยดังนั้น exe ของฉันไม่พบที่กำลัง
Carlos A. Ibarra

7

คำตอบ (ตรวจสอบว่าถูกต้อง) จาก romka นั้นเรียบง่ายและสง่างาม แต่น่าเสียดายที่มันไม่ทำงาน (อย่างน้อยใน Windows 7 และ Windows 8 64 บิตฉันไม่ได้ทดสอบเลย)

ปัญหามาจากข้อเท็จจริงที่ว่าระบบ% PATH% ตัวแปรไม่ได้ขยายตัวแปร env อื่น ๆ : มันทำงานร่วมกับ% SYSTEMDRIVE% ตัวอย่างเช่น แต่น่าเสียดายที่ไม่ได้สำหรับ% PROGRAMFILES% Wikipediaเสนอว่าพฤติกรรมนี้มาจากระดับการอ้อม (% SYSTEMDRIVE% ไม่ได้หมายถึงตัวแปร env ตัวที่สาม)

ทางออกเดียวที่ฉันพบคือการใช้เวทมนตร์ระบบไฟล์เปลี่ยนเส้นทางและไดเรกทอรี System32 / SysWoW64 ตามที่แนะนำในความคิดเห็น

เพื่อหลีกเลี่ยงการปรับใช้ DLLs โดยตรงในไดเรกทอรี Windows ซึ่งโดยปกติจะยากต่อการบำรุงรักษาหนึ่งสามารถปรับใช้ softlink แทนไปยังไดเรกทอรีที่กำหนดเองแทน (ทำงานบน 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 | โดยที่ OPTION คือ x86 หรือ ia64

เริ่มใน: PATH | โดยที่ 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
คุณอาจต้องการแก้ไขให้ถูกต้องเพื่อความชัดเจน - พวกเขาไม่ได้ใช้เทคโนโลยี Intel 64 บิต (ia64 - Itanium CPUs) แต่เป็นเทคโนโลยี AMD 64 บิตซึ่งโดยทั่วไปเรียกว่า x64
Multiverse IT

ขอบคุณสำหรับคำตอบ. ความคิดที่ดี อย่างไรก็ตามฉันกำลังมองหาวิธีแก้ปัญหาระดับระบบเหมือนที่ใช้ในการปรับเปลี่ยน%ProgramFiles%ตัวแปร (อ้างถึง:% ProgramFiles% นั้นขึ้นอยู่กับว่ากระบวนการที่ร้องขอตัวแปรสภาพแวดล้อมนั้นเป็นของตัวเองแบบ 32 บิตหรือ 64 บิต (ซึ่งเกิดจากการเปลี่ยนเส้นทาง Windows-on-Windows 64 บิต) en.wikipedia.org/wiki/ … )
Piotr Dobrogost

1

ฉันแค่อยากจะสรุปคำตอบที่ฉันได้รับโดยทำตามลิงก์ที่ให้ไว้ในคำตอบจาก Baptiste Chardon โดยการใช้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บิตคือ คุณจำเป็นต้องมีเส้นทาง spaceless C:\programsตัวแปรสิ่งแวดล้อมของคุณมิฉะนั้นระบบจะไม่อ่านเพิ่มเติมกว่า

บนเครื่อง 32 บิตของเรา companyprograms ตัวแปรสภาพแวดล้อมเป็นc:\program filesและคนที่ 64 c:\progra~2บิต จากนั้นเราตั้งค่าทางลัดสำหรับผู้ใช้%companyprograms%\...

คุณสามารถทำได้ผ่านนโยบายกลุ่มหรือสคริปต์


-1

ตามที่ romka ระบุไว้ในการติดตามคำตอบง่าย ๆ คือไดเรกทอรี SysWOW64

โชคดีที่ผู้ติดตั้งจากผลิตภัณฑ์Shining Lightดูแลเรื่องนี้ให้คุณ เพียงเรียกใช้ตัวติดตั้ง 32 บิตและ 64 บิตและเลือกเพื่อคัดลอก. DLLs ลงในไดเรกทอรี Window "System" และเลือกไดเรกทอรีที่เหมาะสมสำหรับ. DLLs (เช่น 64bit .DLLs ลงใน System32 และ 32 บิต .DLL ไปที่ SysWOW64

เมื่อฉันทำแอพ 32 บิตนี้แล้วฉันจะพบแอพ 32 บิต. แอลดีแอลและแอพ 64 บิตของฉันจะพบแอพพลิเคชั่น 64 บิต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.