windows - 如何从 32 位模式的批处理文件以 64 位模式运行批处理文件

标签 windows batch-file cmd 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。

最佳答案

您可以在批处理文件的顶部使用以下内容:

@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%" == "" set "SystemPath=%SystemRoot%\Sysnative"
接下来你需要用%SystemPath%调用Windows System32目录下的每个控制台应用程序。在您的批处理文件中,例如 %SystemPath%\findstr.exe .当然你也可以开始 cmd %SystemPath%\cmd.exe从批处理文件中始终运行 64 位命令行解释器。
这个怎么运作?
环境变量 系统路径 首先设置为 System32 Windows 目录。
打包成 32 位可执行文件的批处理文件现在可以运行所有来自 System32 的控制台应用程序。 32 位 Windows 上的目录,但来自 %SystemRoot%\SysWOW64 64 位 Windows 上的目录。
因此,批处理文件接下来检查环境变量 程序文件(x86) 仅在 Windows x64 上存在这种情况。因此,第三行的条件在 Windows x86 和 上为假。系统路径 没有改变。但是系统路径 修改为 %SystemRoot%\Sysnative在 64 位 Windows 上调用 %SystemRoot%\System32 中的应用程序分别来自 32 位可执行文件 cmd.exe没有重定向到 %SystemRoot%\SysWOW64 .
有关更多详细信息,请参阅 Microsoft 文档页面 File System Redirector .
但更好的是在 32 位可执行文件中执行所有操作,该可执行文件将批处理文件提取到 %TEMP%并运行它
%SystemRoot%\System32\cmd.exe /C "%TEMP%\ExtractedBatch.bat"
对于 32 位 Windows,其中环境变量 程序文件(x86) 不存在或与
%SystemRoot%\Sysnative\cmd.exe /C "%TEMP%\ExtractedBatch.bat"
在 64 位 Windows 上。
这里还有一个代码,它可以在批处理文件的顶部使用,以始终运行 64 位控制台应用程序,独立于在 32 位或 64 位 Windows x64 上启动 cmd.exe .
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%" == "" if exist %SystemRoot%\Sysnative\cmd.exe set "SystemPath=%SystemRoot%\Sysnative"
在 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 .

关于windows - 如何从 32 位模式的批处理文件以 64 位模式运行批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090734/

相关文章:

windows - OpenCV 2.3 (C++,QtGui),初始化一些特定的 USB 设备和设置时出现问题

.net - 使用 .NET 在 Windows 上获取实际文件名(使用适当的大小写)

batch-file - 从批处理文件查询注册表时,可以查询数据吗?

if-statement - 批处理 - 用户输入到命令提示符(IF 语句问题)

cmd - windows CMD 在双引号内发送 CRLF

java - MySQL mysqldump from Java code on Win7问题

c++ - 跟踪我程序中的所有函数

java - 如何使用命令提示符了解窗口服务的状态

regex - 如何使用 findstr 提取子字符串

windows - 如何使批处理文件通过新的Windows终端运行?