我希望我的程序在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。
答案 0 :(得分:6)
您可以在批处理文件的顶部使用以下内容:
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%"=="" set "SystemPath=%SystemRoot%\Sysnative"
接下来,您需要在批处理文件中使用%SystemPath%
调用Windows的System32目录中的每个控制台应用程序,例如%SystemPath%\findstr.exe
。当然,您也可以使用%SystemPath%\cmd.exe
启动 cmd ,以便在批处理文件中始终运行64位命令行解释程序。
它如何运作?
环境变量 SystemPath 首先设置为Windows的System32目录。
打包到32位可执行文件中的批处理文件现在可以从32位Windows上的System32目录运行所有控制台应用程序,但是从64位Windows上的%SystemRoot%\SysWOW64
目录运行。
因此,如果存在环境变量 ProgramFiles(x86),则批处理文件会检查,仅在Windows x64上才是这种情况。因此,在Windows x86上第三行的条件为false,并且 SystemPath 不会更改。但 SystemPath 在64位Windows上被修改为%SystemRoot%\Sysnative
,分别从{-1}}调用32位可执行文件%SystemRoot%\System32
中的应用程序,而无需重定向到{{1} }。
有关详细信息,请参阅Microsoft Developer Network(MSDN)中的File System Redirector文章。
但最好是在32位可执行文件中完成所有操作,将批处理文件解压缩到cmd.exe
并使用
%SystemRoot%\SysWOW64
对于32位Windows,其中环境变量 ProgramFiles(x86)不存在或
%TEMP%
在64位Windows上。
这是另外一个代码,可以在批处理文件的顶部使用,以便始终运行64位控制台应用程序,而不依赖于在具有32位或64位%SystemRoot%\System32\cmd.exe /C "%TEMP%\ExtractedBatch.bat"
的Windows x64上启动。
%SystemRoot%\Sysnative\cmd.exe /C "%TEMP%\ExtractedBatch.bat"
在Windows x64上,另外检查cmd.exe
中是否有文件。在这种情况下,批处理文件使用32位@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%"=="" (
if exist %SystemRoot%\Sysnative\* set "SystemPath=%SystemRoot%\Sysnative"
)
执行,只有在这种情况下才需要使用%SystemRoot%\Sysnative
。否则{x 1}也可以在Windows x64上使用,就像批处理文件以64位cmd.exe
启动一样,这是包含64位控制台应用程序的目录。
注意:%SystemRoot%\Sysnative
不是目录。无法%SystemRoot%\System32
到cmd.exe
或使用%SystemRoot%\Sysnative
答案 1 :(得分:3)
c:\windows\sysnative
为32位程序提供对System32的访问权限。
32位
C:\Windows\System32 accesses syswow64
c:\windows\sysnative accesses System32
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。
答案 2 :(得分:0)
TL;Mofi's detailed answer 的 DR 版本:
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%"=="" (
if exist %SystemRoot%\Sysnative\* set "SystemPath=%SystemRoot%\Sysnative"
)
rem Example: Run a command from the system folder:
%SystemPath%\dism
这会将 %SystemPath%
设置为指向本机/“真实”C:\Windows\System32
文件夹的任何路径。
改写解释:
C:\Windows\System32
,这是唯一存在的文件夹。C:\Windows\System32
指向 64 位 C:\Windows\Sysnative
。C:\Windows\System32
指向 64 位 C:\Windows\System32
。推理:
C:\Windows\System32
重定向到 C:\Windows\SysWOW64
,而 C:\Windows\Sysnative
重定向到 C:\Windows\System32
。立>
C:\Windows\Sysnative
不存在,C:\Windows\System32
指向 C:\Windows\System32
。