Asunto: Ejecutar comando msdos y capturar resultado (salida)
¿Cómo puedo capturar la salida de la ejecución de un comando msdos con Delphi? estoy haciendo una aplicación que tiene que ejecutar un comando msdos, en concreto "netstat -a", y guardar el resultado en un fichero de texto ¿cómo puedo hacer esto?
Publicado:
Mie Dic 16, 2009 8:36 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Ejecutar comando msdos y capturar resultado (salida)
Anuncios
varios escribió:
¿Cómo puedo capturar la salida de la ejecución de un comando msdos con Delphi? estoy haciendo una aplicación que tiene que ejecutar un comando msdos, en concreto "netstat -a", y guardar el resultado en un fichero de texto ¿cómo puedo hacer esto?
Puedes descargarte gratuitamente (freeware) la aplicación que incluye el código fuente (open source), esta aplicación ejecuta un comando MS-DOS y muestra el resultado en un TMemo, por lo que puedes guardarlo en fichero:
function IsWinNT: boolean;
var
OSV: OSVERSIONINFO;
begin
OSV.dwOSVersionInfoSize := sizeof(osv);
GetVersionEx(OSV);
result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;
function ejecutarComando (comando : string) : string;
var
Buffer: array[0..4096] of Char;
si: STARTUPINFO;
sa: SECURITY_ATTRIBUTES;
sd: SECURITY_DESCRIPTOR;
pi: PROCESS_INFORMATION;
newstdin, newstdout, read_stdout, write_stdin: THandle;
exitcod, bread, avail: Cardinal;
begin
Result:= '';
if IsWinNT then
begin
InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd, true, nil, false);
sa.lpSecurityDescriptor := @sd;
end
else sa.lpSecurityDescriptor := nil;
sa.nLength := sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle := TRUE;
if CreatePipe(newstdin, write_stdin, @sa, 0) then
begin
if CreatePipe(read_stdout, newstdout, @sa, 0) then
begin
GetStartupInfo(si);
with si do
begin
dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;
hStdOutput := newstdout;
hStdError := newstdout;
hStdInput := newstdin;
end;
Fillchar(Buffer, SizeOf(Buffer), 0);
GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
StrCat(@Buffer,PChar(' /c ' + comando));
if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
begin
repeat
PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
if bread > 0 then
begin
Fillchar(Buffer, SizeOf(Buffer), 0);
ReadFile(read_stdout, Buffer, bread, bread, nil);
Result:= Result + String(PChar(@Buffer));
end;
Application.ProcessMessages;
GetExitCodeProcess(pi.hProcess, exitcod);
until (exitcod <> STILL_ACTIVE) and (bread = 0);
end;
CloseHandle(read_stdout);
CloseHandle(newstdout);
end;
CloseHandle(newstdin);
CloseHandle(write_stdin);
end;
end;
function existeElemento (elemento : string; lista : TComboBox) : boolean;
var
i : integer;
begin
Result := false;
for i := 0 to lista.Items.Count - 1 do
begin
if AnsiUpperCase(elemento) = AnsiUpperCase(lista.Items.Strings[i]) then
begin
Result := true;
Exit;
end;
end;
end;
procedure TForm1.btEjecutarClick(Sender: TObject);
var
fichero : string;
begin
fichero := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'comandos.txt';
if not existeElemento (txtComando.Text, txtComando) then
begin
txtComando.Items.Add(txtComando.Text);
txtComando.Items.SaveToFile(fichero);
end;
txtSalida.Text := ejecutarComando(txtComando.Text);
if FileExists(fichero) then
txtComando.Items.LoadFromFile(fichero);
end;
procedure TForm1.btGuardarClick(Sender: TObject);
begin
if dlGuardar.Execute then
txtSalida.Lines.SaveToFile(dlGuardar.FileName);
end;
procedure TForm1.btSalirClick(Sender: TObject);
begin
close;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
fichero : string;
begin
fichero := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'comandos.txt';
if FileExists(fichero) then
txtComando.Items.LoadFromFile(fichero);
end;
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A