是否可以将整个或部分PATH
环境变量指定为特定于正在运行的进程映像的类型 (32 位/64 位)?当我从 64 位 cmd.exe 中运行某些应用程序时,我希望它选择 64 位版本的 OpenSSL 库,而当我从 32 位 cmd.exe 中运行某些应用程序时,我希望它选择 32 位版本的 OpenSSL 库。
跟进
当 PATH 环境变量中使用 %ProgramFiles% 变量时,where.exe 找不到 OpenSSL 库
答案1
使环境变量%ProgramFiles%
切换%ProgramFiles(x86)%
为您工作:
将包含 x86 和 x64 版本的 OpenSSL 库的文件夹放入适当的目录%programfiles%
中%ProgramFiles(x86)%
,并在PATH
环境变量中通过变量使用对这些文件夹的引用%programfiles%
。
这样,当您在 32 位环境中运行时,您的PATH
条目%programfiles%\OpenSSL\
将自动解析到 %ProgramFiles(x86)%\OpenSSL\
磁盘上。
答案2
romka 提供的答案(经检查为正确)简单而优雅,但不幸的是它不起作用(至少在 Windows 7 和 Windows 8 64 位上,我没有进一步进行测试)。
问题在于系统 %PATH% 变量并不总是扩展其他环境变量:例如它可以与 %SYSTEMDRIVE% 一起使用,但不幸的是不适用于 %PROGRAMFILES%。维基百科表明这种行为来自间接级别(%SYSTEMDRIVE% 不引用第三个环境变量)。
我发现的唯一解决方案是使用文件系统重定向器magic 和目录 System32/SysWoW64,正如评论中所建议的那样。
为了避免直接在 Windows 目录中部署 DLL(这通常很难维护),可以改为部署到自定义目录的软链接(适用于 Windows Vista 及更高版本的 Windows):
- 方法在这里找到:http://realfiction.net/go/153
- 如何在此创建软链接:http://www.howtogeek.com/howto/windows-vista/using-symlinks-in-windows-vista/
顺便说一句,抱歉我没有直接评论相关帖子:目前我的帐户声誉不足以做到这一点。
答案3
是的,完全可以。只需编写三个 .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 | 其中 OPTION 是 x86 或 ia64
开始于:PATH | 其中 PATH 是 first.bat 的路径
该脚本是 Microsoft 用于启动其 Visual Studio 环境的正确命令行的简化脚本。您可以简单地将此脚本扩展到 N 个环境。通过为不同的环境添加更多 .bat 文件,并使用更多选项和 goto 语句编辑 first.bat。我希望它是不言自明的。
我希望微软不会因为我使用他们的脚本而起诉我。
编辑:
啊,我想我有点误解你了。对于 32 位命令行,应按如下方式创建链接:
目标:%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
答案4
我只是想总结一下我通过以下链接获得的答案回答来自 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