gpt4 book ai didi

windows - Delphi - CreateProcess - 执行多个命令

转载 作者:可可西里 更新时间:2023-11-01 09:20:44 25 4
gpt4 key购买 nike

我想通过 CreateProcess() - 调用实现以下目标:

  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 - Build 7601:Service Pack 1

编辑 2:这是解决方案:

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;

最佳答案

调用 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
);

使用来组合标志比+在语义上更清晰,尽管它对这些标志具有相同的效果。

需要注意的一点是第二个参数必须指向可写内存。那是因为 CreateProcess 可能会修改该参数。碰巧,您的 input 设置将满足该要求。在任何情况下,我都建议调用 UniqueString 以明确表示您满足该要求。

我发现缺少的另一件事是关闭 CreateProcess 返回的句柄的代码。最后通过执行以下操作关闭这些句柄:

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

关于windows - Delphi - CreateProcess - 执行多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18013251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com