【发布时间】:2014-11-15 11:35:52
【问题描述】:
我使用Altar的GetDOSOutput()(变体1)到this question通过一个简单的delphi程序调用dos-commands。然而,现有的 DOS 程序,如 DiskPart,在被 CreateProcess 调用时找不到,而从 DOS 提示符(Windows server 2003 X64)调用时它们没有问题。这可能是什么原因?
命令行:`ListVolumes.bat'
ListVolumes.bat:
path
C:\WINDOWS\SYSTEM32\DiskPart.exe /s ListVolumes.scr
dir C:\WINDOWS\SYSTEM32\DiskPart.exe
通过程序调用输出:
I:\PartScan>path
PATH=C:\WINDOWS;C:\WINDOWS\System32;C:\WINDOWS\System32\wbem;C:\Program Files (x86)\Borland\Delphi7\Bin; C:\Program Files (x86)\Borland\Delphi7\Projects\Bpl\;
I:\PartScan>C:\WINDOWS\SYSTEM32\DiskPart.exe /s ListVolumes.scr
'C:\WINDOWS\SYSTEM32\DiskPart.exe' is not recognized as an internal or external command,
operable program or batch file.
I:\PartScan>dir C:\WINDOWS\SYSTEM32\DiskPart.exe
Volume in drive C is system
Volume Serial Number is 351F-0221
Directory of C:\WINDOWS\SYSTEM32
File Not Found
从 DOS 提示符调用时的输出(注意最后的 dir 命令):
PATH=C:\WINDOWS;C:\WINDOWS\System32;C:\WINDOWS\System32\wbem;C:\Program Files (x86)\Borland\Delphi7\Bin; C:\Program Files (x86)\Borl
and\Delphi7\Projects\Bpl\;
I:\PartScan>C:\WINDOWS\SYSTEM32\DiskPart.exe /s ListVolumes.scr
Microsoft DiskPart version 5.2.3790.3959
Copyright (C) 1999-2001 Microsoft Corporation.
On computer: ISOETES
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 F DVD-ROM 0 B Healthy
...
Volume 11 G DVD-ROM 0 B Healthy
I:\PartScan>dir C:\WINDOWS\SYSTEM32\DiskPart.exe
Volume in drive C is system
Volume Serial Number is 351F-0221
Directory of C:\WINDOWS\SYSTEM32
17-Feb-2007 08:17 263,680 diskpart.exe
1 File(s) 263,680 bytes
0 Dir(s) 33,111,334,912 bytes free
【问题讨论】:
-
如果我们可以停止调用控制台应用程序 DOS 程序,那就太好了。不再有 DOS。
-
或者更确切地说,DOS 确实存在,但大多数所谓的 DOS 确实不存在。
-
解决方法很简单,用Sysnative文件夹代替system32目录...
-
据我了解,在 Vista 之前没有引入 SysNative。目标机器运行服务器 2003x64。
-
是的,在您的坚持不懈的推动下,我进一步寻找。起初我只发现了更多的声明,在这个版本中是不可能的,到那时我到达了你在我不在时发布的同一个 kb 页面。荣誉是应得的:它是一种魅力。我似乎无法通过 CLI 进行测试,因为那时不涉及 WOW64。但是将 cmd.exe 称为“C:\windows\Sysnative\cmd.exe”就可以了。
标签: windows delphi batch-file cmd createprocess