SkY*_*AGz 6 64-bit x86 cmd batch-file
我希望我的程序在32位操作系统中以32位模式运行,如果在64位操作系统中则在64位模式下运行.该程序是使用Bat To Exe Converter v2.1.4创建的,因此它基本上是一个批处理文件.通常,当我在32位操作系统上运行批处理文件时,它以32位模式运行,当我在64位操作系统上运行时,它以64位模式运行,不是吗?问题是,使用Bat To Exe Converter v2.1.4我可以选择程序是32位还是64位.所以我必须选择32,否则我认为它不会在32位操作系统上运行.我尝试使用.vbs文件使用.Run和.ShellExecute重新启动程序,但结果是体系结构与转换器中设置的相同.我也试过cmd /c
和%WINDIR%\System32\cmd.exe /c
也%WINDIR%\SysWOW64\cmd.exe /c
,但我无法找到一个方法来做到这一点.我使用Windows 8.0 x64,我的VM是Windows 8.1 x64.
您可以在批处理文件的顶部使用以下内容:
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%"=="" set "SystemPath=%SystemRoot%\Sysnative"
Run Code Online (Sandbox Code Playgroud)
接下来,您需要%SystemPath%
在批处理文件中调用Windows的System32目录中的每个控制台应用程序%SystemPath%\findstr.exe
.当然,你也可以启动cmd,%SystemPath%\cmd.exe
从批处理文件中始终运行64位命令行解释器.
这个怎么运作?
环境变量SystemPath首先设置为Windows的System32目录.
打包到32位可执行文件中的批处理文件现在可以从32位Windows上的System32目录运行所有控制台应用程序,但是从%SystemRoot%\SysWOW64
64位Windows上的目录运行.
因此,如果存在环境变量ProgramFiles(x86),则批处理文件将在下一步检查,仅在Windows x64上才是这种情况.因此,在Windows x86上第三行的条件为false,并且SystemPath不会更改.但SystemPath被修改为%SystemRoot%\Sysnative
在64位Windows上%SystemRoot%\System32
分别从32位可执行文件调用应用程序cmd.exe
而无需重定向%SystemRoot%\SysWOW64
.
有关更多详细信息,请参阅Microsoft Developer Network(MSDN)中的文件系统重定向器文章.
但更好的方法是在32位可执行文件中完成所有操作,该文件将批处理文件解压缩%TEMP%
并运行它
%SystemRoot%\System32\cmd.exe /C "%TEMP%\ExtractedBatch.bat"
Run Code Online (Sandbox Code Playgroud)
对于32位Windows,其中环境变量ProgramFiles(x86)不存在或与
%SystemRoot%\Sysnative\cmd.exe /C "%TEMP%\ExtractedBatch.bat"
Run Code Online (Sandbox Code Playgroud)
在64位Windows上.
这是另外一个代码,可以在批处理文件的顶部使用,以便始终运行64位控制台应用程序,而不依赖于在32位或64位的Windows x64上启动cmd.exe
.
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%"=="" (
if exist %SystemRoot%\Sysnative\* set "SystemPath=%SystemRoot%\Sysnative"
)
Run Code Online (Sandbox Code Playgroud)
在Windows x64上,还会检查是否有文件%SystemRoot%\Sysnative
.在这种情况下,批处理文件以32位执行,cmd.exe
只有在这种情况下才%SystemRoot%\Sysnative
需要使用.否则%SystemRoot%\System32
也可以在Windows x64上使用,因为批处理文件以64位启动时cmd.exe
,这是包含64位控制台应用程序的目录.
注意:%SystemRoot%\Sysnative
不是目录.这是不可能的cd
,以%SystemRoot%\Sysnative
或使用if exist %SystemRoot%\Sysnative
小智 3
c:\windows\sysnative
Run Code Online (Sandbox Code Playgroud)
为 32 位程序提供对 System32 的访问。
32位
C:\Windows\System32 accesses syswow64
c:\windows\sysnative accesses System32
Run Code Online (Sandbox Code Playgroud)
64 位只是执行所告知的操作,直接访问文件夹 - 例如 C:\windows\system32 访问 System32,C:\windows\syswow64 访问 Syswow64。
重点是您应该只编写 32 位程序。64 位程序内部大多是 32 位(只有内存地址是 64 位,其他都保持 32 位)。64 位适用于服务器应用程序。一般程序使用 32 位。
编辑
32 位程序是 32 位,具有 64 位寻址模式,其中 32 位(在 Windows 中基地址始终为 0)未使用,因此内存地址只需要 32 位(偏移量)。
64 位程序是 32 位,具有 64 位偏移内存地址(我不知道 64 位模式下基地址的大小,因为它们始终为 0,并且几十年来一直无关紧要)。64 位程序可以成为完整的 64 位程序,只需在选择时使用 64 位指令即可,通常用于科学或视频处理任务。但是 64 位的一切都会占用太多内存,而 Windows 和其他库则需要 32 位值。
一般原则是您无需执行任何操作即可完成任务。当人们开始考虑 32 位/64 位时,就会遇到麻烦。如果你忽略这个位数,微软已经投入了所有的工作来让它正常工作。
如果您在“开始”-“运行”(Winkey + R) 对话框中键入 iexpress,您将能够制作自己的 bat2exe。