是否可能具有PATH
特定于正在运行的进程的映像类型(32位/ 64位)的全部或部分环境变量?当我从64位cmd.exe内运行某些应用程序时,我希望它选择64位版本的OpenSSL库,而当我从32位cmd.exe内运行某些应用程序时,我希望它选择32位版本的OpenSSL库。
是否可能具有PATH
特定于正在运行的进程的映像类型(32位/ 64位)的全部或部分环境变量?当我从64位cmd.exe内运行某些应用程序时,我希望它选择64位版本的OpenSSL库,而当我从32位cmd.exe内运行某些应用程序时,我希望它选择32位版本的OpenSSL库。
Answers:
让%ProgramFiles%
到%ProgramFiles(x86)%
环境变量转换为你工作:
将带有x32和x64版本的OpenSSL库的文件夹放入相应的%programfiles%
和%ProgramFiles(x86)%
目录中,并在PATH
环境变量中,通过变量使用对这些文件夹的引用%programfiles%
。
这样,当您在x32位环境中运行时,您的PATH
条目%programfiles%/OpenSSL/
将自动解析为 %ProgramFiles(x86)%/OpenSSL/
磁盘上的条目。
romka提供的答案(经检查正确)简单明了,但不幸的是它不起作用(至少在Windows 7和Windows 8 64位上,我没有进一步进行测试)。
问题来自于系统%PATH%变量并不总是扩展其他env变量的事实:例如,它与%SYSTEMDRIVE%一起使用,但不幸的是,不适用于%PROGRAMFILES%。维基百科建议此行为来自间接级别(%SYSTEMDRIVE%不引用第三个env变量)。
我发现的唯一解决方案是使用文件系统重定向器魔术和目录System32 / SysWoW64,如注释中所建议。
为了避免通常难以维护的Windows目录中直接部署DLL,可以改为部署到自定义目录的软链接(在Windows Vista和更高版本的Windows上可用):
顺便说一句,很抱歉没有在相关文章中直接发表评论:目前我的帐户声誉不足,无法做到这一点。
是的,这绝对有可能。只需编写三个.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
%ProgramFiles%
变量的解决方案。(报价:%ProgramFiles%本身取决于请求环境变量的进程本身是32位还是64位(这是由Windows-on-Windows 64位重定向引起的。)。en.wikipedia.org/wiki/ …)
我只是想总结一下我从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
正如romka在后续操作中指出的那样,简单的答案是SysWOW64目录。
幸运的是,Shining Light产品的安装人员会为您解决这一问题。只需运行32位和64位安装程序,然后选择将.DLL复制到“系统”窗口中,并为.DLL选择正确的目录(即64位.DLL进入System32,而32位.DLL进入SysWOW64。
完成此操作后,我的32位应用程序将找到32位.DLL,而我的64位应用程序将找到64位.DLL。
echo %programfiles%
根据运行cmd.exe的类型显示不同的路径,但是where ssleay32.dll
在两种类型的cmd.exe(32位和64位)中都找不到此dll并显示INFO: Could not find files for the given pattern(s).
任何想法?