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

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

是否可以将整个或部分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):

顺便说一句,抱歉我没有直接评论相关帖子:目前我的帐户声誉不足以做到这一点。

答案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

相关内容