Avatar billede stenovitz Praktikant
03. november 2004 - 11:39 Der er 5 kommentarer og
3 løsninger

Dos kommando kald fra Delphi?

Hej

Jeg kunne godt tænke mig at kunne køre DOS kommandoer/batch jobs via Delphi, f.eks. at kunne fyre en linie af som
"copy /b filX + filY filZ".

Hvordan er det lige jeg gør det?
Avatar billede martinlind Nybegynder
03. november 2004 - 11:44 #1
shellexecute('Command.com /c copy .....',,,,);

Noget ala dette
Avatar billede tolderlund Nybegynder
03. november 2004 - 13:20 #2
Jeg synes det var bedre at du brugte TFileStream til dette i stedet for dos kommandoer.
Så har du bedre styr på fejlhåndtering.
Avatar billede borrisholt Novice
03. november 2004 - 16:04 #3
Prøv noget alla det her :

  Security: TSecurityAttributes;
  ReadPipe,
    WritePipe: THandle;
  Start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: PChar;
  BytesRead,
    AppRunning: DWord;
begin
  with Security do
  begin
    nLength := SizeOf(TsecurityAttributes);
    binheritHandle := True;
    lpSecurityDescriptor := nil;
  end;

  if CreatePipe(ReadPipe, WritePipe, @Security, 0) then
  begin
    Buffer := AllocMem(ReadBuffer + 1);
    FillChar(Start, SizeOf(Start), #0);

    Start.cb := SizeOf(Start);
    Start.hStdOutput := WritePipe;
    Start.hStdInput := ReadPipe;
    Start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
    Start.wShowWindow := SW_HIDE;

    if CreateProcess(nil, PChar(DOS_Command), @Security, @Security, True, NORMAL_PRIORITY_CLASS, nil, nil, START, ProcessInfo) then
    begin
      repeat
        AppRunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
        Application.ProcessMessages;
      until (AppRunning <> WAIT_TIMEOUT);

      repeat
        BytesRead := 0;
        ReadFile(readPipe, Buffer[0], ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        OemToAnsi(Buffer, Buffer);
        Memo.Text := Memo.Text + string(Buffer);
      until (BytesRead < ReadBuffer);
    end;

    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
end;


jens B
Avatar billede borrisholt Novice
03. november 2004 - 16:04 #4
HOV mangler lige toppen :

procedure TForm1.CallDOS(DOS_Command: string; const Memo: TMemo);
const
  ReadBuffer = 2400;
var


Jens B
Avatar billede tolderlund Nybegynder
04. november 2004 - 08:50 #5
borrisholt, det er noget kompliceret kode for noget så simpelt :-)

var
  fil1, fil2, filny: TFileStream;
  Count: Integer;
  Buf: array [0..1024] of Byte;
begin
  FileName1 := 'C:\Notes.txt';
  FileName2 := 'C:\Guide.html';
  FileNameNy := 'C:\Test.txt';
  fil1 := nil;
  fil2 := nil;
  filny := nil;
  try
    fil1 := TFileStream.Create(FileName1, fmOpenRead or fmShareDenyWrite);
    fil2 := TFileStream.Create(FileName2, fmOpenRead or fmShareDenyWrite);
    filny := TFileStream.Create(FileNameNy, fmCreate or fmShareDenyWrite);
    while fil1.Position < fil1.Size do
    begin
      Count := fil1.Read(Buf, 1024);
      filny.Write(Buf, Count);
    end;
    while fil2.Position < fil2.Size do
    begin
      Count := fil2.Read(Buf, 1024);
      filny.Write(Buf, Count);
    end;
  finally
    fil1.Free;
    fil2.Free;
    filny.Free;
  end;
Avatar billede hrc Mester
04. november 2004 - 09:14 #6
Der findes også API-funktionerne CopyFile:

BOOL CopyFile(
    LPCTSTR lpExistingFileName,    // pointer to name of an existing file
    LPCTSTR lpNewFileName,    // pointer to filename to copy to
    BOOL bFailIfExists     // flag for operation if file exists
  );   


Parameters
  lpExistingFileName
    Points to a null-terminated string that specifies the name of an existing file.

  lpNewFileName
    Points to a null-terminated string that specifies the name of the new file.

  bFailIfExists
    Specifies how this operation is to proceed if a file of the same name as that specified by lpNewFileName already exists. If this parameter is TRUE and the new file already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.

Så du kunne jo prøve dette:

  CopyFile('C:\WINDOWS\Driver Cache\i386\Driver.Cab','C:\GigantFil.Cab',false);

En streng kan også smutte ned i proceduren:

var
  st1, st2 : string;
begin
  st1 := 'c:\test.dat';
  st2 := 'c:\test2.dat';
  CopyFile(PAnsiChar(st1),PAnsiChar(st2),true);
end;
Avatar billede tolderlund Nybegynder
04. november 2004 - 12:20 #7
CopyFile duer vist ikke her, det var ikke bare en kopiering som stenovitz ønsker.
Avatar billede borrisholt Novice
04. november 2004 - 15:21 #8
tolderlund>> Det er rigtigt .. Indrømmet jeg læste bare overskriften !
"Dos kommando kald fra Delphi?" og til DET formål kan du bruge mit kode, ellers har du fuldstendig ret brug CopyFile

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester