В линуксе есть хорошая функция fpsystem, а в винде нужно использовать TProcess, а его в 3 версии компилятора сломали. Командная строка записывается в ansistring, а он перекодируется с потерей информации.
Казалось бы, есть sysutils.ExecuteProcess но он при ошибке выполнения команды вырубает программу, которая его запустила. Вокруг какое-то вредительство
Добавлено спустя 1 час 53 минуты 59 секунд:Моя прелесть 

 Другого нормального решения (из лазаруса ничего тащить не хотелось) кроме как форкнуть для винды функцию sysutils.ExecuteProcess не нашёл. Но она красиво форкнулась и теперь даже не требует рубить командную строку на кучу частей.
- Код: Выделить всё
- uses
 windows, sysutils;
 
 VAR
 Z5,X5: unicodestring;
 
 
 
 function ExecuteProcess2(Const CommandLine: UnicodeString):longint;
 // win specific  function
 var
 SI: TStartupInfoW;
 PI: TProcessInformation;
 Proc : THandle;
 l    : DWord;
 CommandLine5 : unicodestring;
 // e : EOSError;
 ExecInherits : longbool;
 Flags:TExecuteFlags;
 begin
 ExecuteProcess2:=0;
 Flags:=[];//Пока нету таких данных, пусть будет заглушка.
 FillChar(SI, SizeOf(SI), 0);
 SI.cb:=SizeOf(SI);
 SI.wShowWindow:=1;
 { always surround the name of the application by quotes
 so that long filenames will always be accepted. But don't
 do it if there are already double quotes, since Win32 does not
 like double quotes which are duplicated!
 }
 CommandLine5 := CommandLine + #0;
 
 ExecInherits:=ExecInheritsHandles in Flags;
 
 if not CreateProcessW(nil, pwidechar(CommandLine5),
 Nil, Nil, ExecInherits,$20, Nil, Nil, SI, PI) then
 begin
 //  e:=EOSError.CreateFmt(SExecuteProcessFailed,[CommandLine,GetLastError]);
 //   e.ErrorCode:=GetLastError;
 //   raise e;
 ExecuteProcess2:=-1;
 end;
 Proc:=PI.hProcess;
 if WaitForSingleObject(Proc, dword($ffffffff)) <> $ffffffff then
 begin
 GetExitCodeProcess(Proc,l);
 CloseHandle(Proc);
 CloseHandle(PI.hThread);
 ExecuteProcess2:=l;
 end
 else
 begin
 //    e:=EOSError.CreateFmt(SExecuteProcessFailed,[CommandLine,GetLastError]);
 //    e.ErrorCode:=GetLastError;
 CloseHandle(Proc);
 CloseHandle(PI.hThread);
 //   raise e;
 ExecuteProcess2:=-1;
 end;
 end;
 
 
 
 begin
 GETDIR(0,X5);
 Z5:='"'+X5+'\2.exe"';
 writeln('ExecuteProcess2=',ExecuteProcess2(Z5),' Z5=',Z5);
 end.