Delphi – CreateProcess – 执行多个命令

我想用CreateProcess()调用来实现以下function:

  1. 更改为svn工作副本
  2. 执行svn命令
  3. 将输出传输到文件

我用下面的函数试试这个

procedure TQPortMainForm.CmdMigrationClick(Sender: TObject); var StartInfo: TStartupInfo; ProcInfo: TProcessInformation; CreateOk: boolean; input: String; begin { fill with known state } FillChar(StartInfo, SizeOf(TStartupInfo), #0); FillChar(ProcInfo, SizeOf(TProcessInformation), #0); StartInfo.cb := SizeOf(TStartupInfo); //debug input := 'D: && cd D:\Qport\trunk\Qport\ && ' + SVN_PATH + ' log > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt'; CreateOk := CreateProcess(nil, PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil , StartInfo, ProcInfo); { check to see if successful } if CreateOk then // may or may not be needed. Usually wait for child processes WaitForSingleObject(ProcInfo.hProcess, INFINITE); end; 

根本没有任何反应 有没有人有一个想法如何实现这一目标?

谢谢,

菲利普

编辑1:我正在使用Delphi XE – 生成7601:Service Pack 1

编辑2:这是解决scheme:

 var StartInfo: TStartupInfo; ProcInfo: TProcessInformation; CreateOk: boolean; input: String; path : String; cmd : String; begin { fill with known state } FillChar(StartInfo, SizeOf(TStartupInfo), #0); FillChar(ProcInfo, SizeOf(TProcessInformation), #0); StartInfo.cb := SizeOf(TStartupInfo); path := 'D:\Qport\trunk\Qport\'; cmd := 'C:\Windows\System32\cmd.exe'; //debug input := '/C' + SVN_PATH + ' help > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt'; CreateOk := CreateProcess(PChar(cmd), PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, Pchar(path), StartInfo, ProcInfo); { check to see if successful } if CreateOk then // may or may not be needed. Usually wait for child processes WaitForSingleObject(ProcInfo.hProcess, INFINITE); end; 

Solutions Collecting From Web of "Delphi – CreateProcess – 执行多个命令"

当您调用CreateProcess时,您需要提供一个可执行文件。 我想你习惯于调用ShellExecute ,这是更松懈。

您显然正在调用cmd.exe所以您应该将其添加到命令行。 在cmd.exe启动后,不要更改工作目录,而应使用CreateProcesslpCurrentDirectory参数来完成此操作。 一旦命令完成,您还需要将/C选项传递给cmd.exe以使其关闭。

所以你需要改变input是这样的:

 input := GetEnvironmentVariable('COMSPEC') + ' /C ' + SVN_PATH + ' log > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt'; 

我使用GetEnvironmentVariable('COMSPEC')作为获取命令解释器路径的手段。

然后像这样调用CreateProcess

 CreateProcess( nil, PChar(input), nil, nil, False, CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS, nil, 'D:\Qport\trunk\Qport', StartInfo, ProcInfo ); 

虽然它对这些标志具有相同的效果,但它在语义上更易于使用or组合标志。

有一点要注意,第二个参数必须指向可写内存。 这是因为CreateProcess可能会修改该参数。 碰巧,你的input设置将满足这个要求。 无论如何,在我看来,建议调用UniqueString以明确表示您正在满足该要求。

我看到的另一个缺少的是关闭由CreateProcess返回的句柄的代码。 通过这样做最后关闭这些句柄:

 //WaitForSingleObject(ProcInfo.hProcess, INFINITE); //in case you want to wait for Process to terminate CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread);