none
Pegar um valor do Prompt de comando para um textbox. RRS feed

  • Pergunta

  • Olá pessoal.

    A minha duvida é o seguinte:

    Tenho um bat (arquivo de lote), ela me traz algumas informações extraída da rede, no prompt de comando exemplo:

    wmic /node:hostname computersystem get username

    Este comando me traz o nome do usuário que esta logado em determinada maquina.
    Eu quero pegar este nome e colocar em um Textbox.

    Será que existe essa possibilidade?

    segunda-feira, 1 de junho de 2015 13:24

Respostas

  • Olá Marcelo,

    fiz um exemplo completo, inclusive utilizando Tratamento de Exceções e o objeto BackgroundWorker que permite que sua aplicação continue em execução enquanto o processo é rodado.

    Eu fiz um comando básico, no caso foi o ping.

    Para o seu comando "wmic", peço que verifique se o comando está no Path do Windows ou na pasta da aplicação.

    Pois pode ser que o sistema não está encontrando, e por isso não retorna nada ok.

    Segue o exemplo na Íntegra:

    Form1.cs

    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;
    
    namespace WindowsFormsPrompt
    {
        public partial class Form1 : Form
        {
            private BackgroundWorker objBackgroundWorker = null;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnExecutar_Click(object sender, EventArgs e)
            {
                // Limpa os campos
                lblStatus.Text = "";
                txtResultado.Text = "";
    
                // Configura os Eventos do objeto BackgroundWorker
                objBackgroundWorker = new BackgroundWorker();
                objBackgroundWorker.WorkerReportsProgress = true;
                objBackgroundWorker.DoWork += new DoWorkEventHandler(objBackgroundWorker_DoWork);
                objBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(objBackgroundWorker_ProgressChanged);
                objBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(objBackgroundWorker_RunWorkerCompleted);
                objBackgroundWorker.RunWorkerAsync();
            }
    
            private void objBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                lblStatus.Text = "Processo encerrado.";
                this.Cursor = Cursors.Default;
            }
    
            private void objBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                // Muda o Cursor do Formulário
                this.Cursor = Cursors.WaitCursor;
    
                // Mostra o andamento na barra de Status
                lblStatus.Text = e.UserState.ToString();
    
                // Adiciona o conteúdo do Andamento de retorno do processo em uma caixa de texto
                if (e.ProgressPercentage == 1) // Aqui é verificado se o Progresso é 1, para adicionar na caixa de texto.
                {
                    txtResultado.AppendText(e.UserState.ToString() + Environment.NewLine);
                }
    
            }
    
            private void objBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                try
                {
                    // Configuração do que será executado.
                    System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo("ping");
                    info.Arguments = "www.uol.com.br";
                    info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                    info.RedirectStandardOutput = true;
                    info.UseShellExecute = false;
                    info.CreateNoWindow = true;
    
                    // Atualiza Progresso
                    objBackgroundWorker.ReportProgress(0, "Iniciando processo...");
                    objBackgroundWorker.ReportProgress(0, Environment.NewLine + info.FileName + " " + info.Arguments);
    
                    // Processamento da execução
                    System.Diagnostics.Process processo = new System.Diagnostics.Process();
                    processo.StartInfo = info;
                    processo.Start();
    
                    // Captura do Retorno
                    string linha;
                    while ((linha = processo.StandardOutput.ReadLine()) != null)
                    {
                        objBackgroundWorker.ReportProgress(1, linha); // Ao marcar o progresso como 1, eu indico que ele irá aparecer na minha caixa de texto.
                    }
    
                    // Aguarda o termino para sair.
                    processo.WaitForExit();
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }
    

    Form1.Designer.cs

    namespace WindowsFormsPrompt
    {
        partial class Form1
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Windows Form Designer generated code
    
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.btnExecutar = new System.Windows.Forms.Button();
                this.txtResultado = new System.Windows.Forms.TextBox();
                this.lblStatus = new System.Windows.Forms.Label();
                this.SuspendLayout();
                // 
                // btnExecutar
                // 
                this.btnExecutar.Location = new System.Drawing.Point(218, 187);
                this.btnExecutar.Name = "btnExecutar";
                this.btnExecutar.Size = new System.Drawing.Size(261, 52);
                this.btnExecutar.TabIndex = 1;
                this.btnExecutar.Text = "Executar";
                this.btnExecutar.UseVisualStyleBackColor = true;
                this.btnExecutar.Click += new System.EventHandler(this.btnExecutar_Click);
                // 
                // txtResultado
                // 
                this.txtResultado.Location = new System.Drawing.Point(13, 13);
                this.txtResultado.Multiline = true;
                this.txtResultado.Name = "txtResultado";
                this.txtResultado.ReadOnly = true;
                this.txtResultado.ScrollBars = System.Windows.Forms.ScrollBars.Both;
                this.txtResultado.Size = new System.Drawing.Size(672, 162);
                this.txtResultado.TabIndex = 2;
                // 
                // lblStatus
                // 
                this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                this.lblStatus.Dock = System.Windows.Forms.DockStyle.Bottom;
                this.lblStatus.Location = new System.Drawing.Point(0, 252);
                this.lblStatus.Name = "lblStatus";
                this.lblStatus.Size = new System.Drawing.Size(697, 29);
                this.lblStatus.TabIndex = 3;
                this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(697, 281);
                this.Controls.Add(this.lblStatus);
                this.Controls.Add(this.txtResultado);
                this.Controls.Add(this.btnExecutar);
                this.MaximizeBox = false;
                this.Name = "Form1";
                this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
                this.Text = "Executa Shell";
                this.ResumeLayout(false);
                this.PerformLayout();
    
            }
    
            #endregion
    
            private System.Windows.Forms.Button btnExecutar;
            private System.Windows.Forms.TextBox txtResultado;
            private System.Windows.Forms.Label lblStatus;
        }
    }
    


    Att, Lucio Rogerio


    Espero ter ajudado, se ajudei, por favor "Vote como Útil", e se resolvi seu problema, clique em "Propor como Resposta".

    quarta-feira, 17 de junho de 2015 12:58

Todas as Respostas

  • Bom dia Marcelo.

    Muito obrigado por sua participação no Fórum.

    Por gentileza, verifique este link, ele contem informações importantes referentes a sua dúvida.

    https://social.msdn.microsoft.com/Forums/pt-BR/45c7c2ed-e278-47f8-8a0b-71bdffe5e53f/passar-valor-do-prompt-de-comando-para-o-textbox?forum=vsvbasicpt

    Excelente semana

    Abraços


    terça-feira, 2 de junho de 2015 14:11
  • Sim pode fazê-lo, segue exemplo abaixo:
    Process processo = new Process();
                processo.StartInfo.FileName = "wmic";
                processo.StartInfo.Arguments = "/node:hostname computersystem get username";
                processo.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
                processo.Start();
    
                //Pega retorno
                var retorno = processo.ExitCode;
                TextBox1.Text = retorno.ToString();
    
     



    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 14:22
  • Ola!
    Fiz de acordo com o código acima, e agora me apresentou um erro.
    segunda-feira, 15 de junho de 2015 16:14
  • Antes de pegar o retorno coloque isso aqui:
    processo.WaitForExit();


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    segunda-feira, 15 de junho de 2015 21:48
  • Coloquei, agora me retornou o numero 0 no textbox1.text.
    Mas obrigado pela atenção.
    terça-feira, 16 de junho de 2015 23:27
  • Ai sim, fomos surpreendidos novamente!
    Sou novato, estou aprendendo, vou estudar este código, vamos ver se condigo o resultado pretendido.
    Mas será que não é mais fácil corrigiro o anterior?

    Mas de qualquer forma obrigado pela ajuda.

    quarta-feira, 17 de junho de 2015 15:11
  • Olá consegui de uma forma diferente, segue abaixo:
         public void getSerial(string Serial)
                  {
                      //capturar o numero de serie
                      Serial = txbHostName.Text;
                      Process cmdProcess = null;
                      cmdProcess = new Process();
                      // executa os parametros do wmic com o nome do host capturado na variavel nome1
                      cmdProcess.StartInfo.Arguments = "/node: " + Serial + " bios get serialnumber";
                      // executa o comando wmic
                      cmdProcess.StartInfo.FileName = "wmic.exe";
                      // Redirect stdout
                      cmdProcess.StartInfo.RedirectStandardOutput = true;
                      // Set to false, otherwise you can't redirect stdout
                      cmdProcess.StartInfo.UseShellExecute = false;
                      // Start process
                      if (cmdProcess.Start())
                      {
                          // variavel nome recebe o resultado
                          string nome = cmdProcess.StandardOutput.ReadToEnd();
                          //exclui a cadeia de caracteres a partir do numero dois para a esquerda
                          //textBox1.Text = nome.Substring(nome.LastIndexOf("i") + 2);
                          txb_NSerie.Text = (nome.Substring(13).Trim());
                      }
                      else
    Só que quando, ele processa este código ele abre a janela de prompt, executa e fecha.
    Tem como executar o código sem aparecer a janela de prompt, como se executasse oculto, sem mostrar a janela de prompt?
    quarta-feira, 23 de setembro de 2015 19:52
  • Usa o "WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;" do código de Lucio Rogerio SP que consegue, analise o código dele ja faz o que precisa.

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    sexta-feira, 25 de setembro de 2015 11:01