为什么CreateProcess中的cmd.exe与DOS提示符的行为不同?

时间:2014-11-15 11:35:53

标签: windows delphi batch-file cmd createprocess

我使用Altar' s GetDOSOutput()(变体1)到this question来通过简单的delphi程序调用dos命令。但是,当CreateProcess调用时,无法找到现有的DOS程序,如DiskPart,而从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

1 个答案:

答案 0 :(得分:3)

您没有显示代码,因此我们无法100%确定地对此进行诊断。但是,可能的原因是您的进程是在WOW64仿真器下运行的32位进程。在模拟器下创建cmd进程时,您将获得一个32位cmd进程,该进程也在模拟器下运行。您正在将其与64位进程进行比较。请注意,在模拟器下,文件系统重定向器会将system32重定向到SysWOW64

处理此问题的方法是创建64位进程。从模拟器内部创建时,对cmd执行操作非常棘手。最简单的方法是从64位进程调用CreateProcess

由于您使用Delphi 7,您可能需要使用现代编译器来制作一个小的64位可执行文件,以便为您完成工作。从Delphi 7程序中调用小的可执行文件。

可能符合您需求的替代方法是使用sysnative别名从模拟器内部到达64位系统目录。这在file system redirector documentation中有所描述。