viernes, 18 de febrero de 2011

Llamadas a la línea de comandos usando C#


Con el ejemplo que les voy a pasar, pueden automatizar y miles de tareas con c# usando la línea de comandos cmd.
Como todos saben con el cmd, la línea de comandos de windows, se pueden crear usuarios, prender servicios, copiar archivos, borrar archivos, crear archivos, crear carpetas.

Lo que voy a hacer es mostarles cómo llamar a diferentes procesos usando C# en una aplicación de Windows Forms.

El ejemplo lo pueden bajar haciendo click en el siguiente link:

Download ejemplo. Luego  en la página del link haga click en el botón c# como indica la figura:


Este código realiza las siguientes actividades:

  • Abrir un programa con C# (en este caso, el Microsoft Paint Brush).
  • Abrir en internet explorer una página web (la página de Google).
  • Abrir un archivo existente (un archivo excel existente).
  • Crear un usuario de Windows usando C#.
Acá va el código:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace Shell
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process proc =
                new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            //Llamar a calculadora
            //proc.StartInfo.FileName = "calc";
            //Llamar a MS paintbrush
            //proc.StartInfo.FileName = "mspaint";
            //Llamar al manejador de servicios de Windows
            //proc.StartInfo.FileName = "services.msc";
            //Llamar al Event Viewer
              proc.StartInfo.FileName = "eventvwr.msc";


            proc.Start();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "mspaint";
            proc.Start();

        }

        private void button3_Click(object sender, EventArgs e)
        {

            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "iexplore";
            proc.StartInfo.Arguments = "http://www.google.com";           
            proc.Start();
            proc.WaitForExit();
            //Matar proceso
            //proc.Kill();

        }

        private void button4_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = @"c:\doc.xlsx";
            proc.Start();

        }

        private void button5_Click(object sender, EventArgs e)
        {
            crearusuario(textBox1.Text,textBox2.Text);

        }
           
        private void crearusuario(string usuario, string password)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "cmd";
            proc.StartInfo.RedirectStandardInput = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.Start();
            proc.StandardInput.WriteLine(@"net user "+usuario+" "+password+" /add");
            proc.StandardInput.Flush();
            proc.StandardInput.Close();
            proc.Close();
        }

    }
}

El código es simple: 


           System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "mspaint";
            proc.Start();
En esta parte estoy llamando al Microsoft PaintBrush (mspaint).

          System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "iexplore";
            proc.StartInfo.Arguments = "http://www.google.com";           
            proc.Start();
            proc.WaitForExit();
En este sector estoy llamando al internet explorer (iexplore) y le digo que abra la página de Google.

          System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = @"c:\doc.xlsx";
            proc.Start();
Acá simplemente le digo que abra el archivo doc.xlsx que es un archivo Excel existente.

          System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "cmd";
            proc.StartInfo.RedirectStandardInput = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.Start();
            proc.StandardInput.WriteLine(@"net user "+usuario+" "+password+" /add");
            proc.StandardInput.Flush();
            proc.StandardInput.Close();
            proc.Close();

Este trozo de código, esta usando el comando net user. Net user es la línea de comandos para crear usuarios locales dentro de mi sistema operativo. Usuario y password son mis variables.

De esta forma se puede crear código para miles de opciones. Espero que se entienda. Si desean crear usuarios de Active Directory, van a necesitar el comando dsadd user.

  • Para detener servicios se usa el comando net stop.
  • Para iniciar servicios se usa el comando net start
  • Para crear carpetas mkdir.
En fin, son miles de comandos que se pueden realizar mediante la línea de comandos cmd y con lo que les mostré, la pueden llamar desde C#.




Si tienen dudas, escriban a este blog. Gracias !!





People who read this post also read :



8 comentarios:

  1. Estimado
    Te cuento, actualmente desarrollo una aplicación con C# en la cual por medio de ella, los usuarios suben documentos a un FTP destinado a esto. Pues bien, en algun momento estos documentos deben ser visualizados por los usuarios y es ahi donde tengo el problema.

    Si bien cuando realizó las pruebas localmente (en mi PC donde desarrollo) al pinchar un boton para ver el documento este se levanta y lo veo, cuando paso la aplicación a un servidor de pruebas no me permite verlo arrojando el siguiente error "No application is associated with the specified file for this operation".

    Cabe señalar que la aplicación al momento de leer el documento va a la carpeta del FTP, extrae el documento y lo deja en una carpeta dentro de la misma aplicación y luego procede a abrirlo.

    Adjunto código que actualmente utilizo.

    protected void VerDocumento(string nombreArchivo, string ruta)
    {
    FtpWebRequest reqFTP;
    try
    {
    string inputfilepath = MapPath("~/Archivos/" + nombreArchivo);
    FileStream outputStream = new FileStream(inputfilepath, FileMode.Create);

    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(Ftp + ruta + "/" + nombreArchivo));
    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
    reqFTP.UseBinary = true;
    reqFTP.Credentials = new NetworkCredential(Usuario, Pass);
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
    Stream ftpStream = response.GetResponseStream();
    long cl = response.ContentLength;
    int bufferSize = 2048;
    int readCount;
    byte[] buffer = new byte[bufferSize];

    readCount = ftpStream.Read(buffer, 0, bufferSize);
    while (readCount > 0)
    {
    outputStream.Write(buffer, 0, readCount);
    readCount = ftpStream.Read(buffer, 0, bufferSize);
    }

    ftpStream.Close();
    outputStream.Close();
    response.Close();

    // iniciamos la instancia de la clase process
    System.Diagnostics.Process proc = new System.Diagnostics.Process();

    // nombre del archivo a abrir
    proc.StartInfo.FileName = inputfilepath;

    proc.StartInfo.Verb = "Open";
    // arrancamos el proceso
    proc.Start();

    // liberamos recursos
    proc.Close(); // atención: close no termina el proceso


    }
    catch (Exception ex)
    {
    Trace.Write("Problemas para ver el Archivo.");
    Trace.Write(ex.Message);
    if (ex.InnerException != null)
    {
    Trace.Write(ex.InnerException.Message);
    }
    throw;
    }

    }

    Se antemano se agradecería la ayuda proporcionada

    ResponderEliminar
  2. Normalmente es un problema de permisos en el servidor FTP. En tu máquina te conectas a tu servidor o al servidor de producción.

    ResponderEliminar
  3. Hola. Estoy realizando una aplicación que utilice un escanner, y a pesar de que al mayoría de la información que he encontrado señalan que debo manejar el driver directamente, yo sigo pensando que sería mucho mejor utilizar el software que trae el hardware. ¿cómo puedo identificar los comandos para seleccionar el perfil y ejecutar el evento "Escanear"? Gracias.

    ResponderEliminar
  4. Depende del software que tengas y las librerías que incluya para realizar la función.

    La verdad hay muy poca documentación al respecto.

    ResponderEliminar
  5. Hola, ¿Cómo le hago cuando quiero mandar más de un argumento?

    ResponderEliminar
  6. Usa un archivo .bat y ahi pon el contenido.

    ResponderEliminar
  7. Me gusto tu aporte, pero me podrías ayudar a crear un comando en C# necesito un comando que cree una carpeta y luego otro que la copie. y que para crearla ponga el comando que se invento y luego la dirección donde se guardará.

    ResponderEliminar
  8. crear carpeta:

    mkdir carpeta1

    copiar carpeta

    cp c:\carpeta1 c:\destino

    ResponderEliminar