在64位的環(huán)境隔披,32位的程序調用bat腳本執(zhí)行cluster.exe 提示 “‘cluster’不是內部或外部命令...”
解決辦法是加入 “cd /d C:\Windows\Sysnative”
問題描述:寫了一個2_test.exe 程序調用1.bat腳本收津, 單獨執(zhí)行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>
執(zhí)行的結果是:
產生問題的原因是 :32位的程序在64位的環(huán)境中調用cmd時噪珊,cmd是調用到SysWOW64中cmd.exe執(zhí)行晌缘,而不是調用的System32中的cmd.exe。而SysWOW64中cmd.exe中是沒有cluster.exe 這個命令的痢站。
在SysWOW64中的cmd.exe執(zhí)行“cluster node”的結果:
在System32中的cmd.exe執(zhí)行“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位的應用程序在必要時重定向杂瘸。