Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ejecutar comandos en cmd.exe (https://www.clubdelphi.com/foros/showthread.php?t=88967)

albelg 04-09-2015 16:53:27

ejecutar comandos en cmd.exe
 
hola colegas del forum, aqui estoy nuevamente con otras interrogantes. Resulta que ahora necesito que se ejecuten una serie de comandos en cmd.exe pero sin yo hacerlo directamente, Por ahora lo que tengo es que puedo abrir el simbolo del sistema desde mi aplicacion, pero no tengo idea de como enviarle una serie de comandos:

Código Delphi [-]
procedure TForm1.abrir_cmdClick(Sender: TObject);
var
operacion,nombre,parametro,path:string;
begin
  operacion:='open';
   nombre:='cmd.exe';
   parametro:='C:\WINDOWS\SYSTEM32';
   path:='C:\Windows\System32';
   shellexecute(handle,pchar(operacion),pchar(nombre),pchar(parametro),pchar(path),sw_shownormal);
end;

Ya hasta aqui tengo abierto el cmd.exe y ahora ? como le envio los comandos desde mi aplicacion ?

gracias de antemano

ecfisa 04-09-2015 18:12:07

Hola albelg.

Al desconocer cuáles comandos vas a ejecutar, es difícil dar una respuesta concreta.
Podría convenirte llamar a un archivo de procesamiento por lotes que contenga los comandos o ir ejecutándolos de a uno, depende...

Saludos :)

roman 04-09-2015 18:57:03

Tal como dice ecfisa, necesitas dar más detalles. Si por comandos te refieres a otros programas pues simplemente los mandas ejecutar con ShellExecute o WinExec. Si te refieres a comandos internos de DOS, como del, dir, ren, etc., entonces puedes usar el parámetro /C de cmd.exe:

Código Delphi [-]
ShellExecute(Handle, 'open', 'cmd.exe', '/c del foo', 'c:\ruta\al\archivo', SW_HIDE); // Borra el archivo foo

Código Delphi [-]
ShellExecute(Handle, 'open', 'cmd.exe', '/c ren foo goo', 'c:\ruta\al\archivo', SW_HIDE); // renombra foo a goo

// Saludos

albelg 04-09-2015 20:11:21

lo que necesito es por el cmd dar los siguientes comandos:
1- telnet xx.xx.xx.xx
2- nombre de usuario
3- contraseña
4- y varios comandos especificos del equipo al cual me estoy conectando por telnet.

el objetivo principal es que yo pueda ver lo que esta pasando en el ambiente de la consola para despues ponerlo en un Memo y analizarlo.
gracias y disculpen no haberme explicado bien a la primera.

OJO: tengo que tomar los datos desde la consola y no de otra forma.

ecfisa 05-09-2015 00:49:14

Cita:

Empezado por albelg (Mensaje 496300)
lo que necesito es por el cmd dar los siguientes comandos:
1- telnet xx.xx.xx.xx
2- nombre de usuario
3- contraseña
4- y varios comandos especificos del equipo al cual me estoy conectando por telnet.

el objetivo principal es que yo pueda ver lo que esta pasando en el ambiente de la consola para despues ponerlo en un Memo y analizarlo.
gracias y disculpen no haberme explicado bien a la primera.

OJO: tengo que tomar los datos desde la consola y no de otra forma.

Hola abelg.

Revisa si en estos enlaces encontras alguna opción útil:
Saludos :)

escafandra 05-09-2015 01:27:17

Muy probablemente te interese este tema acerca de comunicación por telnet via delphi.


Saludos.

kurono 05-09-2015 05:29:01

hace tiempo que tenia la misma necesidad que tu y pude hacerlo gracia a este codigo

Código Delphi [-]
function IsWinNT: boolean;
var
  OSV: OSVERSIONINFO;
begin
  OSV.dwOSVersionInfoSize := sizeof(osv);
  GetVersionEx(OSV);
  result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;

function CmdExec(Cmd: 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 ' + Cmd));
      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;

ejemplo de uso

begin

ShowMessage(CmdExec('dir c:\'));
ShowMessage(CmdExec('netstat -a -n'));

end;
end.

Delphi01 24-04-2016 18:47:31

hola [kurono] he probado lo que pusiste pero los mensajes me salieron en chino y caracteres raros !!!!

me podrías decirme porque por favor ? Gracias .

kurono 25-04-2016 07:35:07

en que version de windows esta ejecutando la funcion que te pase

clauxs88 26-10-2016 19:56:24

Salen Letras en chino y caracteres raros al ejecutar la funcion
 
Cita:

Empezado por Delphi01 (Mensaje 504649)
hola [kurono] he probado lo que pusiste pero los mensajes me salieron en chino y caracteres raros !!!!

me podrías decirme porque por favor ? Gracias .

A mi tambien me pasa lo mismo, lo compile en Delphi XE. Algo asi,,

਍潃普杩牵捡ꉩ偉搠⁥楗摮睯൳ഊ
਍摁灡慴潤⁲敤䔠桴牥敮⁴瑅敨湲瑥ഺഊ

kurono 28-10-2016 01:03:16

ese codigo yo lo compile en delphi 7 y ejecutado en windows xp y funcionaba perfecto


La franja horaria es GMT +2. Ahora son las 02:34:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi