Вот набросал тестовый пример:
- Код: Выделить всё
procedure Run(FullPathRunProcessCommand:String);
var
CharBuffer: array [0..511] of char;
i, n, ReadCount: integer;
Str, StrTemp, StrRemainder: string;
Running: Boolean;
begin
ExitCode := -1;
Proc := TProcess.Create(nil);
Proc.Options := [poUsePipes];
Proc.CommandLine := 'bash';
// Proc.CurrentDirectory := '/home';
Proc.Execute;
Proc.Input.Write(Pointer(FullPathRunProcessCommand)^, Length(FullPathRunProcessCommand));
Proc.CloseInput;
while Proc.Running do
begin
StrRemainder:= '';
// read stdout and write to our stdout
while Proc.Output.NumBytesAvailable > 0 do
begin
ReadCount := Min(512, Proc.Output.NumBytesAvailable); //Read up to buffer, not more
Proc.Output.Read(CharBuffer, ReadCount);
Str:= StrRemainder + Copy(CharBuffer, 0, ReadCount);
for i:=0 to Length(Str) do
begin
n:= Pos(''#10'', Str);
if n > 0 then
begin
StrTemp:= Copy(Str, 1, n - 1);
Delete(Str, 1, Length(StrTemp)+1);
FormMain.CmdBox1.Writeln(StrTemp);
end
else
begin
StrRemainder:= Str;
Break;
end;
end;
end;
// read stderr and write to our stderr
StrRemainder:= '';
while Proc.Stderr.NumBytesAvailable > 0 do
begin
ReadCount := Min(512, Proc.Stderr.NumBytesAvailable); //Read up to buffer, not more
Proc.Stderr.Read(CharBuffer, ReadCount);
Str:= StrRemainder + Copy(CharBuffer, 0, ReadCount);
for i:=0 to Length(Str) do
begin
n:= Pos(''#10'', Str);
if n > 0 then
begin
StrTemp:= Copy(Str, 1, n - 1);
Delete(Str, 1, Length(StrTemp)+1);
FormMain.CmdBox1.Writeln(StrTemp);
end
else
begin
StrRemainder:= Str;
Break;
end;
end;
end;
end;
ExitCode := Proc.ExitStatus;
if ExitCode > 0 then
begin
FormMain.CmdBox1.Writeln('Error code: ' + IntToStr(ExitCode));
end;
end;
Описание проблемы:
при смене каталога (допустим выполнения cd..) не могу придумать как получить новое значение каталога, есть два варианта:
1й - отслеживать вручную значение FullPathRunProcessCommand, но это не всегда прокатит.
2й - как то заставить не завершаться запущенный процесс bash и передавать ему pwd (не нашел параметра для bash как это сделать).
есть ли у кого то мысли как можно это реализовать?