适用于32位和64位Windows的不同PATH环境变量-可能吗?


14

是否可能具有PATH特定于正在运行的进程的映像类型(32位/ 64位)的全部或部分环境变量?当我从64位cmd.exe内运行某些应用程序时,我希望它选择64位版本的OpenSSL库,而当我从32位cmd.exe内运行某些应用程序时,我希望它选择32位版本的OpenSSL库。

跟进
where.exe没有找到的OpenSSL库时的%ProgramFiles%变量PATH环境变量用来

Answers:


9

%ProgramFiles%%ProgramFiles(x86)%环境变量转换为你工作:

将带有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 2011年

这可能帮助:Altough这可能帮助:stackoverflow.com/questions/906310/...
Darokthar

1
如果其中一个dll是32位的,则在64位计算机上,它应该进入C:\ windows \ syswow64文件夹
romka 2011年

这对我不起作用。当我在PATH变量定义中包含%ProgramFiles%时,它根本不会扩展,因此我的exe找不到其dll。
卡洛斯·伊瓦拉

7

romka提供的答案(经检查正确)简单明了,但不幸的是它不起作用(至少在Windows 7和Windows 8 64位上,我没有进一步进行测试)。

问题来自于系统%PATH%变量并不总是扩展其他env变量的事实:例如,它与%SYSTEMDRIVE%一起使用,但不幸的是,不适用于%PROGRAMFILES%。维基百科建议此行为来自间接级别(%SYSTEMDRIVE%不引用第三个env变量)。

我发现的唯一解决方案是使用文件系统重定向器魔术和目录System32 / SysWoW64,如注释中所建议。

为了避免通常难以维护的Windows目录中直接部署DLL,可以改为部署到自定义目录的软链接(在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,它们被放置在第一个bat文件上方的名为bin的文件夹中。您将拥有:

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文件,以及使用更多选项和goto语句编辑first.bat。我希望这是自我解释。

我希望微软不要因为使用他们的脚本而起诉我。

编辑:

啊,我想我误会了你。对于32位cmd行,应将链接创建为:

目标:%windir%\ SysWoW64 \ cmd.exe“ PATH \ first.bat” x86

编辑2:

尝试类似的东西:

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 CPU),而是使用通常称为x64的AMD64位技术。
Multiverse IT

感谢您的回答。这个主意很好。但是我一直在寻找某种系统级解决方案,例如用于修改%ProgramFiles%变量的解决方案。(报价:%ProgramFiles%本身取决于请求环境变量的进程本身是32位还是64位(这是由Windows-on-Windows 64位重定向引起的。)。en.wikipedia.org/wiki/ …
Piotr Dobrogost 2011年

1

我只是想总结一下我从Baptiste Chardon 答案中提供的链接获得的答案。通过使用mklink命令行工具在中C:\Windows\system32 中创建目录符号链接C:\Windows\SysWOW64,每个都有相同的名称(尽管目标不同),然后可以将其中一个添加C:\Windows\system32Path环境变量中。例如:

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位机器上,环境变量companyprogram是,c:\program files而在64位机器上是c:\progra~2。然后,我们为用户设置快捷方式以%companyprograms%\...

您可以通过组策略或脚本来实现。


-1

正如romka在后续操作中指出的那样,简单的答案是SysWOW64目录。

幸运的是,Shining Light产品的安装人员会为您解决这一问题。只需运行32位和64位安装程序,然后选择将.DLL复制到“系统”窗口中,并为.DLL选择正确的目录(即64位.DLL进入System32,而32位.DLL进入SysWOW64。

完成此操作后,我的32位应用程序将找到32位.DLL,而我的64位应用程序将找到64位.DLL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.