在64位的环境,32位的程序调用bat脚本执行cluster.exe 提示 “‘cluster’不是内部或外部命令...”
解决办法是加入 “cd /d C:\Windows\Sysnative”
问题描述:写了一个2_test.exe 程序调用1.bat脚本, 单独执行1.bat脚本的时候可以运行,但是通过2_test.exe调用1.bat脚本时无法运行。
2_test.exe代码:
<code>
int _tmain(int argc, _TCHAR* argv[])
{
system("1.bat");
system("pause");
return 0;
}
</code>
1.bat脚本代码:
<code>
cluster node /status
</code>
执行的结果是:
产生问题的原因是 :32位的程序在64位的环境中调用cmd时,cmd是调用到SysWOW64中cmd.exe执行,而不是调用的System32中的cmd.exe。而SysWOW64中cmd.exe中是没有cluster.exe 这个命令的。
在SysWOW64中的cmd.exe执行“cluster node”的结果:
在System32中的cmd.exe执行“cluster node”的结果:
解决办法:在调用的脚本中加入 “cd /d C:\Windows\Sysnative”, 调用 System32中的cmd.exe
1.bat 脚本修改:
<code>
cd /d C:\Windows\Sysnative
cluster node /status
</code>
运行结果:
参考资料:
- http://stackoverflow.com/questions/949959/why-do-64-bit-dlls-go-to-system32-and-32-bit-dlls-to-syswow64-on-64-bit-windows
- http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm
- http://blog.csdn.net/fly2leo/article/details/11620273
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx
- https://blogs.msdn.microsoft.com/tianlin/2011/10/26/syswow64/
- https://zhuanlan.zhihu.com/p/22311533?refer=jilinxiaohuo
附录:
Wow64,全称是32bit Windows On 64bit Windows(64位Windows上的32位Windows)。
你也可以这样理解,虽然整个系统是运行在64位模式,但如果一个应该程序是32位的,Windows会在64位的基础上,加载一个“32位的Windows”。这样,这个32位应用程序就以为自己是运行在32位的系统之上的。
于是,你也可以想象,这就意味着,64位的Windows,不但带有64位操作系统应有的系统文件,还带有32位系统应有的系统文件。
我们都知道的是,Windows系统的主要系统文件都是放在一个叫做System32的文件夹中的。为了能同时放下两套系统文件,Windows会在64位的系统上,增加了一个文件夹,叫SysWow64。
这便有了一个问题,System32和SysWow64里面,哪个放的是64位的系统文件,哪个放的是32位的系统文件呢?
在64位中, System32 存放的是64位的系统文件, SysWow64存放的是32位对应的系统文件。
此外,为了保证32位应用程序不与64位应用程序相冲突,除了System32文件夹外,注册表也需要为32位和64位提供两套,也需要让32位的应用程序在必要时重定向。