uruchomienie pliku bat z parametrami

0

Witam,

w jaki sposób z poziomu delphi przekazać do pliku *.bat parametry i wykonać go?

próbowałem na kilka sposobów i żaden nie daje pożądanego rezultatu:

  1. WinExec()
WinExec('c:\sciezka\plik.bat parametr1 parametr2',SW_SHOW);
  1. ShellExecuteEx()
function uruchom(nazwaPliku:string; parametr1: string; parametr2: string):cardinal;
var
  Rec: TShellExecuteInfo;
  return: cardinal;
begin
  FillChar(Rec, SizeOf(Rec), #0);
  Rec.cbSize       := SizeOf(Rec);
  Rec.fMask        := SEE_MASK_NOCLOSEPROCESS;
  Rec.lpVerb       := PChar('');
  Rec.lpFile       := PChar(nazwaPliku);
  Rec.lpParameters := PChar( parametr1 + ' ' + parametr2);
  Rec.lpDirectory  := PChar('');
  Rec.nShow        := SW_SHOW;
  ShellExecuteEx(@Rec);
  hProcess := Rec.hProcess;
  if Rec.hProcess<>0 then begin
    WaitForInputIdle(Rec.hProcess, 5000);
    GetExitCodeProcess(Rec.hProcess, return);
    Result := return;
    CloseHandle(Rec.hProcess);
  end;
end;
  1. createProcess()
function uruchom2(nazwaPliku: string; parametr1: string; parametr2: string): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
return : cardinal;
begin
  result := true;
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_SHOW;
  CreateProcess(PChar(aFileName), PChar(' '+parametr1+ ' ' + parametr2), nil,nil, False, NORMAL_PRIORITY_CLASS, nil, nil,StartupInfo, ProcessInfo);

  GetExitCodeProcess(ProcessInfo.hProcess, return);
  while return = STILL_ACTIVE do begin
    Application.ProcessMessages;
    result := GetExitCodeProcess(ProcessInfo.hProcess, return);
  end;
end;

pozdrawiam Dawid

0

Dodam jeszcze że funkcja ShellExecute() realizuje to co chcę uzyskać ale połowicznie, uruchamia bat'a przekazuje parametry... ale nie mogę poczekać na jej zakończenie

ShellExecute(Handle,'open',pchar('c:\skrypt.bat'),'parametr1 parametr2',nil,SW_SHOW);

pozdrawiam

0

Spróbuj WinExec'a, ale tak:

WinExec('C:\MojBat.bat \"Ciag danych" \Parametr2', SW_Show);

Chodzi tutaj o "" przed parametrem
Chyba powinno działać.

0

@Patryk27: ?!?
po pierwsze, slash a nie backslash, po drugie to nie ma żadnego znaczenia, po trzecie jak nie jesteś pewien, to nie wprowadzaj zamieszania.

niestety nie mam czasu zerknąć do dokumentacji i sprawdzić, co konkretnie jest nie tak, ale nie powinno być najmniejszego problemu z przekazaniem parametrów przez dowolną z funkcji, które podałeś. przeczytaj dokładnie dokumentację na msdn, poszukaj na google podobnych problemów.

0

Ja robiłem zawsze tak:

WinExec(PChar(sciezka), SW_SHOW);

gdzie sciezka jest scieżką i parametrami np C:\aa.bat -r -v

0

dzięki wszystkim za pomoc, oto działająca już funkcja uruchamiająca plik z parametrami, zwraca wynik dopiero po zakończeniu wykonywania uruchomionego pliku (exe, bat etc.)

function uruchom(nazwaPliku, parametry, katalog: PChar; Show: Cardinal = SW_HIDE; czekajNaZakonczenie: Boolean = true): cardinal;
var
	done: Boolean;
	info: TShellExecuteInfo;
begin
  FillChar(info, SizeOf(info), #0);
  info.cbSize := SizeOf(info);
  info.fMask := SEE_MASK_NOCLOSEPROCESS;
  info.lpVerb := PChar(''); //na przykład runas
  info.lpFile := nazwaPliku;
  info.lpParameters := parametry;
  info.lpDirectory := katalog;
  info.nShow := Show;
  done := Boolean(ShellExecuteEx(@info));
  if done then begin
    if czekajNaZakonczenie then begin
      while WaitForSingleObject(info.hProcess,100) = WAIT_TIMEOUT do begin
       //tu można dodać na przykład application.ProcessMessage;
      end;
      done := GetExitCodeProcess(info.hProcess, DWord(Result));
    end else begin
      Result := 0;
    end;
  end;
  if not done then Result := -1;
end;

pozdrawiam Dawid

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.