Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Dos command (https://www.delphipraxis.net/167448-dos-command.html)

value is NULL 30. Mär 2012 08:40

Dos command
 
Hi Leute ...

Hab schon viel gegoogelt und bin leider noch zu keinem befriedigendem Ergebnis gekommen. Ich möchte Dos befehle in meiner
Kommandozeilen app abschießen können und die Ausgabe via Writln oder was auch immer anzeigen.

das dürfte mit
Delphi-Quellcode:
ShellExecute( 0, 'open', 'cmd', PChar('/k '+command), NIL, SW_ShowNormal );
funktioniere... tuts aber nicht

hat jemand einen Tipp für mich?

LG
Steffen

Luckie 30. Mär 2012 08:50

AW: Dos command
 
Was ist abschießen*? Was ist command? Was funktioniert nicht?

*) Es vereinfacht die Verständigung ungemein, wenn man sich allgemein verständlich ausdrückt.
**) Shellexecute hat auch einen Rückgabewert, den man eventuell mal abfragen könnte.

DeddyH 30. Mär 2012 08:51

AW: Dos command
 
Und was funktioniert nicht?

Codewalker 30. Mär 2012 08:52

AW: Dos command
 
Da du die Ausgabe haben willst, solltest du dich mal mit dem Stichwort "Pipes" auseinandersetzen. Damit bekommst du dann die Ausgabe in dein Programm, mit ShellExecute führst du es nur aus.
Beispiele wären z.B. http://stackoverflow.com/questions/9...o-a-delphi-app

Bernhard Geyer 30. Mär 2012 08:52

AW: Dos command
 
Zitat:

Zitat von value is NULL (Beitrag 1159339)
... Ich möchte Dos befehle in meiner Commandozeilen app abschießen können

DOS? setzt du noch Win9x/ME ein?

value is NULL 30. Mär 2012 09:01

AW: Dos command
 
also um mal alle offenen Fragen zu beantworten ;)

- nicht dos sondern cmd kommandos
- commands = Kommandos wie zB "dir"
- abschießen = ausführen ;)
- was nicht funktioniert? Irgendwie passiert nichts :/

LG

himitsu 30. Mär 2012 09:08

AW: Dos command
 
Zitat:

Kommandos wie zB "dir"
Wieso das und warum nicht direkt über die WinAPI?

value is NULL 30. Mär 2012 09:09

AW: Dos command
 
wie meinst du das ?

Coffeecoder 30. Mär 2012 09:10

AW: Dos command
 
Hi,
Suchst du sowas? siehe hier

himitsu 30. Mär 2012 09:11

AW: Dos command
 
Delphi-Quellcode:
DIR
> Delphi-Referenz durchsuchenFindFirst MSDN-Library durchsuchenFindFirstFile

Zitat:

Zitat von Luckie (Beitrag 1159341)
**) Shellexecute hat auch einen Rückgabewert, den man eventuell mal abfragen könnte sollte.

Zitat:

Zitat von DeddyH (Beitrag 1159342)
Und was funktioniert nicht?

Zitat:

Zitat von value is NULL (Beitrag 1159346)
also um mal alle offenen Fragen zu beantworten ;)

Alle?

value is NULL 30. Mär 2012 09:22

AW: Dos command
 
Es geht mir nicht nur um DIR sondern um Alle Befehle, welche ich in einem CMD Prompt executen kann. (ipconfig, dir, copy, usw usw )

Der Sinn liegt darin, das ich ein kleines commandline Tool bastle, indem ich verschiedene Befehle ausführen kann. hier möchte ich eben noch
oben genannte DOS Befehle einbinden dh. Die Eingabe sieht dann ca so aus: execcmd <DOS-BEFEHL>.

DeddyH 30. Mär 2012 09:23

AW: Dos command
 
Bei mir funktioniert der Code. Hast Du denn nun endlich den Rückgabewert von ShellExecute ausgewertet? Was steht drin?

[edit] Oder was sagt diese Variante?
Delphi-Quellcode:
procedure ExecuteCommand(const command: string);
const
  ENV_VAR = '%COMSPEC%';
var
  comspec: string;
  ReturnValue: integer;
begin
  SetLength(comspec, ExpandEnvironmentStrings(ENV_VAR, nil, 0) + 1);
  ExpandEnvironmentStrings(ENV_VAR, PChar(comspec), Length(comspec));
  SetLength(comspec, StrLen(PChar(comspec)));
  if comspec <> '' then
    begin
      ReturnValue := ShellExecute(0, 'open', PChar(comspec),
        PChar('/k ' + command), nil, SW_SHOW);
      if ReturnValue < 33 then
        MessageBox(0, PChar(Format('Fehler bei ShellExecute: %d', [ReturnValue])
          ), nil, MB_OK or MB_ICONERROR);
    end
  else
    MessageBox(0, 'Kommandointerpreter konnte nicht ermittelt werden.', nil,
      MB_OK or MB_ICONERROR);
end;
[/edit]

value is NULL 30. Mär 2012 09:58

AW: Dos command
 
Das funktioniert echt gut! Aber wie krieg ich das in meine Consoleapp und nicht in das extra cmd Fenster ?

LG

DeddyH 30. Mär 2012 10:07

AW: Dos command
 
Dein Programm ist eine Konsolenanwendung? Dann wird das mit ShellExecute vermutlich nicht funktionieren. Wenn ich die Hilfe zu MSDN-Library durchsuchenCreateProcess richtig deute, könnte es damit evtl. klappen, ist aber aufwändiger. In dem Zusammenhang wäre dann der dwCreationFlags-Parameter der Funktion interessant.

himitsu 30. Mär 2012 10:13

AW: Dos command
 
Jupp, du mußt dann die Handle deines Consolenfensters an die anderen Anwendungen übergeben,
nicht daß die sich noch eine eigene Console aufmachen.

value is NULL 30. Mär 2012 10:15

AW: Dos command
 
Ich gebe zu ich hab keinen Plan :(

Coffeecoder 30. Mär 2012 10:23

AW: Dos command
 
Ich empfehle dir ein Tutorial zu Handles dann anzugucken:angel:

DeddyH 30. Mär 2012 10:25

AW: Dos command
 
http://www.textarchiv.alojado.de/tex...den-ap777.html Probier halt ein wenig mit den verschiedenen Möglichkeiten herum.

p80286 30. Mär 2012 10:28

AW: Dos command
 
Du möchtest eine Consolenanwendung erstellen, die ähnlich wie die CMD.EXE agiert, zusätzlich aber noch die Möglichkeit bietet, Abfragen an eine DB zu schicken.

Mir ist entfallen welche DB Du nutzt, aber ich möchte wetten, daß auch diese eine Möglichkeit bietet per Kommandozeile auf sie zuzugreifen.

Vielleicht wäre es einfacher für Dich, bereits vorhandene Tools zu nutzen, als das Rad noch einmal neu zu erfinden?

Gruß
K-H

Tonic1024 30. Mär 2012 10:40

AW: Dos command
 
Vielleicht ist das nen Blick wert: DOSCommand

Hab damit mal ein eigenes "Konsolenfenster" programmiert und ihm Extrafeatures verpasst. Geht ja fast in deine Richtung.

Gruß,

Toni

guinnes 30. Mär 2012 11:10

AW: Dos command
 
Hier gibts eine von Sirius überarbeitete Version von TDosCommand

value is NULL 30. Mär 2012 11:35

AW: Dos command
 
Zitat:

Zitat von guinnes (Beitrag 1159399)
Hier gibts eine von Sirius überarbeitete Version von TDosCommand

Das klingt gut... werds mal probieren

value is NULL 30. Mär 2012 11:43

AW: Dos command
 
also irgendwie krieg ichs nicht zum laufen ....
in dem Beispiel steht

Delphi-Quellcode:
var diskname: string;
      --
      DosCommand1.CommandLine := 'c:\myformat.bat a:';
      DosCommand1.Execute; //launch format process
      DosCommand1.SendLine('', True); //equivalent to press enter key
      DiskName := 'test';
      DosCommand1.SendLine(DiskName, True); //enter the name of the volume
Aber wenn ich die Unit einbinde bekomme ich bei DosCommand den CommandLine vorschlag nicht :/

guinnes 30. Mär 2012 12:05

AW: Dos command
 
Zitat:

Zitat von value is NULL (Beitrag 1159406)
Aber wenn ich die Unit einbinde bekomme ich bei DosCommand den CommandLine vorschlag nicht :/

Hast du das Ding als Komponente installiert und verwendest die Komponente, oder erzeugst du das Dingen im Quelltext ?
Delphi-Quellcode:
procedure TfrmTSMain.btnExecuteClick(Sender: TObject);
var
  Command : String;
begin
  if JvOpenDialog.Execute then
  begin
    RxTrackInfo.EmptyTable;
    JvOpenDialog.InitialDir := ExtractFilePath(JvOpenDialog.FileName);
    lbxFileList.Items.Add(JvOpenDialog.FileName);
    mmMeta.Lines.Clear;
    mmDosCommand.Lines.Clear;
    Command := ExtractFilePath(Application.ExeName) + 'tsmuxer "' + JvOpenDialog.FileName + '"';
    DosCommand.CommandLine := Command;
    DosCommand.Execute;
  end;
end;
Tut bei mir einwandfrei

value is NULL 30. Mär 2012 12:26

AW: Dos command
 
Zitat:

Zitat von guinnes (Beitrag 1159412)
Zitat:

Zitat von value is NULL (Beitrag 1159406)
Aber wenn ich die Unit einbinde bekomme ich bei DosCommand den CommandLine vorschlag nicht :/

Hast du das Ding als Komponente installiert und verwendest die Komponente, oder erzeugst du das Dingen im Quelltext ?
Delphi-Quellcode:
procedure TfrmTSMain.btnExecuteClick(Sender: TObject);
var
  Command : String;
begin
  if JvOpenDialog.Execute then
  begin
    RxTrackInfo.EmptyTable;
    JvOpenDialog.InitialDir := ExtractFilePath(JvOpenDialog.FileName);
    lbxFileList.Items.Add(JvOpenDialog.FileName);
    mmMeta.Lines.Clear;
    mmDosCommand.Lines.Clear;
    Command := ExtractFilePath(Application.ExeName) + 'tsmuxer "' + JvOpenDialog.FileName + '"';
    DosCommand.CommandLine := Command;
    DosCommand.Execute;
  end;
end;
Tut bei mir einwandfrei

ne ich habs als Unit in meiner commandline app eingebunden :/

guinnes 30. Mär 2012 12:40

AW: Dos command
 
Zitat:

Zitat von value is NULL (Beitrag 1159415)
ne ich habs als Unit in meiner commandline app eingebunden :/

Wie ?

value is NULL 30. Mär 2012 12:48

AW: Dos command
 
Habe die Unit in meinen Libary Ordner gepackt und in die Uses eingebunden.

LG

guinnes 30. Mär 2012 12:53

AW: Dos command
 
Zitat:

Zitat von value is NULL (Beitrag 1159421)
Habe die Unit in meinen Libary Ordner gepackt und in die Uses eingebunden.

Und das Objekt erzeugt und die nötigen Eventhandler geschrieben und angebunden ?

Klaus01 30. Mär 2012 12:53

AW: Dos command
 
.. bin mir nicht sicher aber ist TDosCommand nicht eine Klasse?
.. hast Du davon eine Instanz erzeugt?

Delphi-Quellcode:
dosCommand := TDosCommand.create;
Grüße
Klaus

value is NULL 30. Mär 2012 13:09

AW: Dos command
 
Zitat:

Zitat von Klaus01 (Beitrag 1159424)
.. bin mir nicht sicher aber ist TDosCommand nicht eine Klasse?
.. hast Du davon eine Instanz erzeugt?

Delphi-Quellcode:
dosCommand := TDosCommand.create;
Grüße
Klaus

Alles klar.. funktioniert!!!

ich teste mal die Unit !


LG

Klaus01 30. Mär 2012 13:10

AW: Dos command
 
da wo Du es benötigst als var
Delphi-Quellcode:
dosCommand : TDosCommand;
Grüße
Klaus

value is NULL 30. Mär 2012 13:13

AW: Dos command
 
Ich habe das jetzt so versucht:

Delphi-Quellcode:
function execcmd(command : string) : string;
var
  error : string;
  RC : Cardinal;
  doscommand : TDosCommand;
begin
  Writeln('Try to execute '+command+' ...');
  //ExecuteCommand(command);
  doscommand := TDosCommand.Create(nil);
  doscommand.CommandLine := command;
  doscommand.Execute;
end;
Wie fange ich jetzt die Ausgabe ab ?

LG Steffen

guinnes 30. Mär 2012 13:22

AW: Dos command
 
Zitat:

Zitat von value is NULL (Beitrag 1159432)
Ich habe das jetzt so versucht:

Das kann auch nicht mehr als ein Versuch sein. Ist dir klar, daß du da Speicherlöcher produzierst ?
Zitat:

Wie fange ich jetzt die Ausgabe ab ?
Indem du die besagten Events behandelst ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz