Search code examples
delphicmdcreateprocessshellexecuteshellexecuteex

Run Multiple Tasks in the same Command Line using ShellExecuteEx in Delphi


I am trying to run multiple tasks in the same command line using ShellExecuteEx. I have no issue running it in cmd.exe, as shown below:

    C:\Program Files (x86)\AppFolder>App.exe MyTask1&&App.exe MyTask2

    Running task: Task1
    Table: Task1 100
    Complete

    Running task: Task2
    Table: Task2 100
    Complete

    C:\Program Files (x86)\AppFolder>

Now, here's my ShellExecuteEx version in Delphi running one task without any issue:

    procedure TfrmGTX.btnQBSyncClick(Sender: TObject);
     var
       FileName, Parameters, Folder, Directory: string;
       sei: TShellExecuteInfo;
       Error: DWORD;
       OK: boolean;
     begin
       Folder := 'C:\Program Files (x86)\AppFolder\';
       FileName := Folder + 'App.exe';
       Parameters := 'MyTask1';
       ZeroMemory(@sei, SizeOf(sei));
       sei.cbSize := SizeOf(sei);
       sei.lpFile := PChar(FileName);
       sei.lpParameters := PChar(Parameters);
       sei.lpDirectory := PChar(Folder);
       sei.nShow := SW_SHOWNORMAL;
       OK := ShellExecuteEx(@sei);
       if not OK then
         begin
           Error := GetLastError;
           ShowMessage('Error: ' + IntToStr(Error));
         end;
     end;

What I am trying to achieve is to run 2 tasks one after the other using ShellExecuteEx. No pre-condition/relationship between them. Its the same function but serves data to different tables in my database.

My questions are:

  1. Is it possible to run these 2 tasks in 1 ShellExecuteEx command in the parameter? If so, what's the best way to do it inside the parameter?
  2. Or should I create a for loop to run these 2 tasks one after the other?
  3. Or any suggestion?

I prefer the first one as it is cleaner and within the functionalities of ShellExecuteEx.

I have seen some works saying that I should separately run them or create some script.


Here's the result of the ExecuteDOSOutput shared by @Alex_89. So, far it runs multiple tasks in one trigger and able to capture result in MyApp TMemo. Except only that the result is different from what I expected:

Running task: Task1

Table: A_SALES 0% ◘◘◘0% ◘◘◘0% ◘◘◘0% ◘◘◘0% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘100◘◘◘100◘◘◘100◘◘◘100
Complete
Running task: Task2

Table: A_OUTPUTVAT 0% ◘◘◘0% ◘◘◘0% ◘◘◘0% ◘◘◘0% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘1% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘2% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘3% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘4% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘5% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘6% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘7% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘8% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘9% ◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘10%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘11%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘12%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘13%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘14%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘15%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘16%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘17%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘18%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘19%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘20%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘21%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘22%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘23%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘24%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘25%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘26%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘27%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘28%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘29%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘30%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘31%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘32%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘33%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘34%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘35%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘36%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘37%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘38%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘39%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘40%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘41%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘42%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘43%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘44%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘45%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘46%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘47%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘48%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘49%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘50%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘51%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘52%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘53%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘54%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘55%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘56%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘57%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘58%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘59%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘60%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘61%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘62%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘63%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘64%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘65%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘66%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘67%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘68%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘69%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘70%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘71%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘72%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘73%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘74%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘75%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘76%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘77%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘78%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘79%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘80%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘81%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘82%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘83%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘84%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘85%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘86%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘87%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘88%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘89%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘90%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘91%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘92%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘93%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘94%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘95%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘96%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘97%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘98%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘99%◘◘◘100◘◘◘100◘◘◘100◘◘◘100
Complete
Running task: Task3

Table: Customer 
Complete

I am expecting to get real-time progressive % such as what I get when I run this in CMD.exe.

Running task: Task1
Table: Task1 100        //progress % shown here
Complete

Running task: Task2
Table: Task2 100        //progress % shown here
Complete

Running task: Task3
Table: Task2 100        //progress % shown here
Complete

My intention is to capture the progress % real-time from CMD.exe and embed the same to MyApp as progress bar or something, so I could trigger completion and allow user to proceed.

I am just hoping if anyone could help me capture progress % real-time from CMD.exe?


Solution

  • I came across this snippet a few years ago when I was trying to get the output of a DOS command. Maybe it'll help you with your problem at hand. You can just call this procedure and any command you pass will be executed. I already tested it passing more than 1 command (joined by an &) and it works perfectly. For example:

    ExecuteDOSCommand('getmac & ipconfig & vol', Output);
    

    It's an alternate way of executing a DOS command. The code is long and somewhat hard to understand, I know, but it may help you too. Just try it out. You shouldn't need to change anything, just call the procedure using your own parameters. Here's the snippet:

    procedure TForm1.ExecuteDOSCommand(Command: String; Output: TStrings; TimeOut: Int64 = 0);
    var
      ProcessStartupInfo: STARTUPINFO;
      SecurityAttributes: SECURITY_ATTRIBUTES;
      SecurityDescriptor: SECURITY_DESCRIPTOR;
      ProcessInformation: PROCESS_INFORMATION;
      PipeReadHandle, PipeWriteHandle: THandle;
      BytesRead, ExitCode: Cardinal;
      Buffer, UnicodeOutput: array[0..4095] of Char;
      NormalizedStr, FullOutputStr: String;
      EndingWaitTime: TDateTime;
    
      function IsWinNT: Boolean;
      var
        OSVerInfo: OSVERSIONINFO;
      begin
        OSVerInfo.dwOSVersionInfoSize := SizeOf(OSVerInfo);
        GetVersionEx(OSVerInfo);
        Result := OSVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT;
      end;
    
    begin
      Output.Clear;
    
      if IsWinNT then
      begin
        InitializeSecurityDescriptor(@SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
        SetSecurityDescriptorDacl(@SecurityDescriptor, True, nil, False);
        SecurityAttributes.lpSecurityDescriptor := @SecurityDescriptor;
      end
      else
        SecurityAttributes.lpSecurityDescriptor := nil;
    
      SecurityAttributes.nLength := SizeOf(SECURITY_ATTRIBUTES);
      SecurityAttributes.bInheritHandle := True;
    
      if CreatePipe(PipeReadHandle, PipeWriteHandle, @SecurityAttributes, 0) then
        try
          GetStartupInfo(ProcessStartupInfo);
    
          with ProcessStartupInfo do
          begin
            dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
            wShowWindow := SW_HIDE;
            hStdInput := PipeReadHandle;
            hStdOutput := PipeWriteHandle;
            hStdError := PipeWriteHandle;
          end;
    
          Fillchar(Buffer, SizeOf(Buffer), #0);
          GetEnvironmentVariable('ComSpec', @Buffer, SizeOf(Buffer));
          StrCat(@Buffer, PChar(' /c ' + Command));
    
          if CreateProcess(nil, @Buffer, nil, nil, True, CREATE_NEW_CONSOLE, nil, nil, ProcessStartupInfo, ProcessInformation) then
          begin
            CloseHandle(ProcessInformation.hThread);
            EndingWaitTime := IncMilliSecond(Now, TimeOut);
    
            repeat
              PeekNamedPipe(PipeReadHandle, @Buffer, SizeOf(Buffer), @BytesRead, nil, nil);
    
              if BytesRead > 0 then
              begin
                Fillchar(Buffer, SizeOf(Buffer), #0);
                ReadFile(PipeReadHandle, Buffer, BytesRead, BytesRead, nil);
                FillChar(UnicodeOutput, SizeOf(UnicodeOutput), #0);
                OemToChar(@Buffer, UnicodeOutput);
                NormalizedStr := StringReplace(UnicodeOutput, '♪', #13, [rfReplaceAll]);
                NormalizedStr := StringReplace(NormalizedStr, '◙', #10, [rfReplaceAll]);
                FullOutputStr := FullOutputStr + NormalizedStr;
              end;
    
              GetExitCodeProcess(ProcessInformation.hProcess, ExitCode);
            until ((ExitCode <> STILL_ACTIVE) and (BytesRead = 0)) or ((TimeOut > 0) and (EndingWaitTime < Now));
    
            CloseHandle(ProcessInformation.hProcess);
            Output.Text := FullOutputStr;
          end;
        finally
          CloseHandle(PipeReadHandle);
          CloseHandle(PipeWriteHandle);
        end;
    end;
    

    Assuming you had a button named Button1, and a memo named Memo1 on your form, you could write this Event Handler for the Button1's OnClick event. This is a practical example code of how you would use this procedure:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Output: TStrings;
    begin
      Output := TStringList.Create;
      try    
        ExecuteDOSCommand('getmac & ipconfig & vol', Output);
        Memo1.Lines := Output;
      finally
        Output.Free;
      end;
    end;
    

    By the way, this is my "uses" clause for the current example:

    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ComCtrls, DateUtils;
    

    Note how I included the DateUtils unit in my "uses" clause. This is necessary for a specific function call in the snippet (IncMilliSecond(Now, TimeOut);). The rest of the "uses" varies depending on your needs.