Récupérer une entrée en mode console

cs_hendrix Messages postés 65 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 18 novembre 2008 - 8 oct. 2004 à 13:27
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021 - 20 oct. 2004 à 01:02
Bonjour à tous

Je cherche à faire un petit programme simple en mode console, je voudrais récupérer le résultat en entrée dans le style suivant:

echo "test" >> monprogramme.exe
ou
copy fichier1 ... >> monprogramme.exe

J'ai essayé avec la variable input sans succès.

Est ce que quelqu'un sait faire ça ?

Merci par avance pour votre réponse ou votre aide.

Meilleures salutations à tous !

hendrix

6 réponses

cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
14 oct. 2004 à 05:39
Function GetCommandLine:String;
var j : Integer;
begin
J:=1;
Result:='';
while paramstr(j)<>'' do
begin
Result:=Result+#13+#10+Paramstr(j);
Inc(j);
end;
end;

ShowMessage(GetCommandLine);

Bon Coding ....

ManChesTer.
0
cs_hendrix Messages postés 65 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 18 novembre 2008 1
14 oct. 2004 à 13:15
Merci beaucoup à toi, je m'empresse de l'essayer et je te tiens au courant.

Meilleures salutations.

hendrix
0
cs_hendrix Messages postés 65 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 18 novembre 2008 1
14 oct. 2004 à 21:47
Bonsoir,

En fait ton code ne correspond pas à ce que je cherche. Ta fonction permet de récupérer le contenu d'une ligne de commande, à savoir:

monprogramme.exe param1 param2 param3

et l'affiche dans une boite comme suit:

param1
param2
param3

Moi, ce que je souhaiterais faire (et je sais même pas si c'est possible !), c'est récupérer dans un programme delphi le résulat d'une commande dos exécutée sous dos en mode console.

dans une console:
macommande >> mon_programme_delphi.exe

et traiter le résutat de ma commande

exemple dans un cmd:

echo salut >> c:\salut.txt ceci te met le mot salut dans le fichier c:\salut.txt
moi j'aimerais récupére la chaine caractère "salut"

echo salut >>mon_prog_delphi.exe

et mon programme delphi afficherais salut

Mon idée est en fait de gérer le résultat de copies de fichiers que j'aimerais enregistrer dans une base de donnée

par exemple:

echo toto.mp3 >> mon_prog_delphi.exe
copy c:\toto.mp3 d:\archive\toto.mp3 >> mon_prog_delphi.exe

on retrouvera à ce moment là dans ma base de donnée:

toto.mp3
1 fichier copié

Voilà, j'espère que c'est plus clair, c'est vrai que je n'avais pas trop donné de détail !

Merci d'avance pour votre aide à tous !

Meilleures salutations,

hendrix
0
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
15 oct. 2004 à 09:28
ah, ok

alors c'est simple

Echo Ligne de texte bien longue >>C:\Dir de mon Exe\Temp.Txt

Dans ton programme :

un timer a 200ms (par ex)

dans le on timer :

var MyAstuce : Tstrings;
Texte : String;
begin
If not Fileexists('Temp.Txt') then exit;
MyAstuce:=TstringList.Create;
MyAstuce.LoadFromFile('Temp.Txt');
Texte:=MyAstuce[MyAstuce.Count-1]; // Texte=ton texte dos
MyAstuce.Free;
DeleteFile('Temp.Txt');
...
code pour ajouter texte a la base de donnée....
...
end;

Bon Coding ....

ManChesTer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_hendrix Messages postés 65 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 18 novembre 2008 1
19 oct. 2004 à 11:21
Bonjour,

En fait j'avais pensé à cette solution mais je trouvais plus confortable et élégant de pouvoir utiliser éventuellement la redirection en entrée sur mon exécutable.
En effet, toute commande dos redirigée vers un fichier texte, y inscrit la chaine de caractère....donc je me disais, pourquoi ne pas la capturer par un exécutable et s'en servir !!

Dans l'aide de delphi sur la commande assign pour l'utilisation de fichiers: ( je la mets ici)
///////////// extrait de l'aide de delphi ////////////////////////
Associates the name of an external file with a file variable.

Unit

System

Category

file management routines

procedure AssignFile(var F; FileName: string);

Description

Call AssignFile to initialize a file variable. F is a file variable of any file type. FileName is a string-type expression or an expression of type PChar if extended syntax is enabled.

After calling AssignFile, F is associated with the external file until F is closed. All further operations on the file variable F operate on the external file named by FileName.

////////////// voilà ce que je voulais utiliser ///////////////
When the FileName parameter is empty, AssignFile associates F with the standard input or standard output file. If assigned an empty name, after a call to Reset (F), F refers to the standard input file, and after a call to Rewrite (F), F refers to the standard output file.
////////////// fin de ce que je voulais utiliser ///////////////

Do not use AssignFile on a file variable that is already open.

Note: To avoid scope conflicts, AssignFile replaces the Assign procedure that was available in previous versions of Delphi. However, for backward compatibility Assign is still available.
////////////// fin de la page d'aide //////////////////////////////

Bon, je n'y suis toujours pas arrivé comme je voulais, (à savoir sans passer par un fichier intermédiaire), donc comme suit:

commande_dos_à_exécuter >> mon_programme_delphi

Par contre si on décide d'utiliser la variable input "native" de delphi, ceci fonctionne:

mon_programme_delphi < fichier_resultat_de_la_cmd_dos

Bon, je crains qu'il ne faille pas faire dans l'élégance...mais que fait-on dans le cas ou l'utilisateur qui exécutera le programme n'a pas le droit d'écrire sur le disque because on l'a volontairement bridé en NTFS :-) ... oui, je sais, passer par le répertoire temporaire...bref, on tourne en rond :-) !!

Merci pour ton aide en tout cas, et si tu as le super déclic sur :

commande_dos_à_exécuter >> mon_programme_delphi

sans passer par un fichier mais en prenant peut être l'entrée par un assign qui ne pointe sur aucun fichier, ça serait génial !!!

Meilleures salutations !

hendrix
0
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
20 oct. 2004 à 01:02
Hendrix,

En fait ce que tu veux faire ne peux fonctionner de cette facon, la raison est que :

Echo Hello Wold >> filename.ext
Dos ecrit hello world dans un fichier nommé filename.ext

Donc si tu fais
Echo Hello Wold >> Monprojet.exe
Dos va essayer d'effacer Monprojet.exe, de le recréer, et d'ecrire "Hello World" dans Monprojet.exe.

Il y a un autre moyen, c'est de passer par un pipe, je ne sais pas si ca te conviens, mais voici un petit exemple:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm) // un bouton 2 mémos
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
Function DosCapture(Filename:String):String;
Const Rbuffer=4096;
Var Security : TSecurityAttributes;
Start : TStartupInfo;
ProcessInfo : TProcessInformation;
WPipe,RPipe : THandle;
Buffer : Array[0..4096] of char;
BRead : Dword;
Ret : Dword;
begin
With Security do
begin
nLength := SizeOf(TSecurityAttributes);
bInheritHandle := true;
lpSecurityDescriptor := nil;
end;
if Createpipe(RPipe,WPipe,@Security, 0) then
begin
FillChar(Start,Sizeof(Start),#0);
with start do
begin
cb := SizeOf(start);
hStdOutput := WPipe;
hStdInput := RPipe;
dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
wShowWindow := SW_Hide;
end;
if CreateProcess(nil,PChar(FileName),@Security,@Security,true,
NORMAL_PRIORITY_CLASS,nil,nil,start,ProcessInfo) then
begin
repeat
Ret:=WaitForSingleObject(ProcessInfo.hProcess,50);
BRead := 0;
ReadFile(RPipe,Buffer[0],RBuffer,BRead,nil);
if BRead>0 then
begin
Buffer[BRead]:=#0;
OemToAnsi(Buffer,Buffer);
Result:=Result+String(buffer);
Form1.Memo2.Lines.Text:=Result; // visualiser ce que dos fais...
SendMessage(Form1.Memo2.Handle, WM_VSCROLL, SB_BOTTOM, 0 );
end;
Application.ProcessMessages;
until Ret<>WAIT_TIMEOUT;
end;
CloseHandle(WPipe);
CloseHandle(RPipe);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var j:Integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Text:=DosCapture('Tracert www.borland.com');
For j:=0 to Memo1.Lines.Count do // ^^^remplacer par le nom d'un .bat
If Memo1.Lines[j]='' then
Memo1.Lines.Delete(j);
end;

end.

Bon Coding ....

ManChesTer.
0
Rejoignez-nous