如何在32位模式下从批处理文件以64位模式运行批处理文件

时间:2014-11-23 15:37:00

标签: batch-file cmd x86 64-bit

我希望我的程序在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。

3 个答案:

答案 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%\System32cmd.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 文件夹的任何路径。

改写解释:

  • 在 32 位操作系统上,它将指向 C:\Windows\System32,这是唯一存在的文件夹。
  • 在 64 位操作系统上,当作为 32 位进程运行时,它将通过路径 C:\Windows\System32 指向 64 位 C:\Windows\Sysnative
  • 在 64 位操作系统上,当作为 64 位进程运行时,它将通过路径 C:\Windows\System32 指向 64 位 C:\Windows\System32

推理:

  • 在 32 位操作系统上,只有一个 32 位操作系统并且没有文件系统重定向器。
  • 在 64 位操作系统上,当作为 32 位进程运行时,路径 C:\Windows\System32 重定向到 C:\Windows\SysWOW64,而 C:\Windows\Sysnative 重定向到 C:\Windows\System32
  • 在 64 位操作系统上,作为 64 位进程运行时,路径 C:\Windows\Sysnative 不存在,C:\Windows\System32 指向 C:\Windows\System32

official documentation