在 Windows x64 上不仅有 1 个%SystemRoot%\System32。有 2 个这样的目录。
真正的%SystemRoot%\System32 目录是用于64 位应用程序的。此目录包含一个 64 位的cmd.exe。
但也有用于 32 位应用程序的 %SystemRoot%\SysWOW64。如果 32 位应用程序访问 %SystemRoot%\System32,则使用此目录。它包含一个 32 位的cmd.exe。
32 位应用程序可以通过在路径中使用别名 %SystemRoot%\Sysnative 访问 64 位应用程序的 %SystemRoot%\System32。
有关更多详细信息,请参阅有关 File System Redirector 的 Microsoft 文档。
因此,子目录run 是在%SystemRoot%\System32 中为 64 位应用程序创建的,而 32 位 cmd 运行时该目录不存在,因为在 %SystemRoot%\SysWOW64 中没有子目录 run是 %SystemRoot%\System32 用于 32 位 cmd.exe 或 子目录 run 是在 %SystemRoot%\System32 中创建的 32 位应用程序和 64 位 cmd 运行此目录不存在是因为%SystemRoot%\System32 中没有子目录run,因为该子目录仅存在于%SystemRoot%\SysWOW64 中。
如果 64 位应用程序的子目录 run 位于 %SystemRoot%\System32 中,则可以在批处理文件的顶部使用以下代码:
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%" == "" if exist %SystemRoot%\Sysnative\* set "SystemPath=%SystemRoot%\Sysnative"
System32\run 目录中的每个控制台应用程序都必须在批处理文件中使用%SystemPath% 执行,例如%SystemPath%\run\YourApp.exe。
它是如何工作的?
在 Windows x86 上没有环境变量 ProgramFiles(x86),因此实际上只有顶部定义的一个 %SystemRoot%\System32。
但是在 Windows x64 上定义了环境变量 ProgramFiles(x86) 的值。因此,如果%SystemRoot%\Sysnative 中有文件,则会在 Windows x64 上额外检查。在这种情况下,批处理文件当前由 32 位 cmd.exe 处理,只有在这种情况下才需要使用 %SystemRoot%\Sysnative。否则,%SystemRoot%\System32 也可以在 Windows x64 上使用,因为当批处理文件由 64 位 cmd.exe 处理时,这是包含 64 位控制台应用程序的目录(以及子目录 run)。
注意:%SystemRoot%\Sysnative 不是目录! cd 到 %SystemRoot%\Sysnative 或使用 if exist %SystemRoot%\Sysnative 或 if exist %SystemRoot%\Sysnative\ 是不可能的。它是一个仅存在于 32 位可执行文件的特殊别名,因此有必要使用 if exist %SystemRoot%\Sysnative\cmd.exe 或更通用的 if exist %SystemRoot%\Sysnative\* 检查使用此路径是否存在一个或多个文件。