Avatar billede chrisrj Forsker
22. februar 2021 - 15:32 Der er 12 kommentarer og
1 løsning

Korrekt rækkefølge af kommandoer i CMD

Hejsa

Jeg laver et konsol program som skal udfører en række kommandoer i korrekt rækkefølge.

Men den metode jeg bruger nu, virker ikke.

Funktionen jeg bruger pt.:
private static void cmdCommand(string adbCommand)
        {
         
            if (adbCommand != "")
            {
                ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
                cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
                cmdStartInfo.RedirectStandardOutput = true;
                cmdStartInfo.RedirectStandardError = true;
                cmdStartInfo.RedirectStandardInput = true;
                cmdStartInfo.UseShellExecute = false;
                cmdStartInfo.CreateNoWindow = true;

                Process cmdProcess = new Process();
                cmdProcess.StartInfo = cmdStartInfo;
                cmdProcess.ErrorDataReceived += cmd_Error;
                cmdProcess.OutputDataReceived += cmd_DataReceived;
                cmdProcess.EnableRaisingEvents = true;
                cmdProcess.Start();
                cmdProcess.BeginOutputReadLine();
                cmdProcess.BeginErrorReadLine();
           
                cmdProcess.StandardInput.WriteLine(adbCommand);   
            }

        }
Avatar billede chrisrj Forsker
22. februar 2021 - 15:34 #1
...og så glemte jeg afslutningen. :D

Den kaldes således:
cmdCommand("adb devices");
osv.

Håber der er godt svar at få! :D
Avatar billede arne_v Ekspert
22. februar 2021 - 15:46 #2
Mit bud:

cmdStartInfo.RedirectStandardOutput = true;
...
cmdProcess.StandardInput.WriteLine(adbCommand);   

->

cmdStartInfo.RedirectStandardOutput = false;
cmdStartInfo.ArgumentList>Add("/c");
cmdStartInfo.ArgumentList>Add(adbCommand);
Avatar billede arne_v Ekspert
22. februar 2021 - 15:46 #3
.Add ikke >Add
Avatar billede chrisrj Forsker
22. februar 2021 - 15:52 #4
Hmmm...den vil ikke genkende ArgumentList?
Avatar billede arne_v Ekspert
22. februar 2021 - 16:04 #5
.NET Core / .NET 5 ting

Proev:

cmdStartInfo.Arguments = "/c " + adbCommand;

(bemaerk mellemrun)
Avatar billede chrisrj Forsker
22. februar 2021 - 16:08 #6
Hmmm...der kommer fejl, hvis jeg beholder de mellemliggende linier.

Hvis jeg udkommentere dem, sker der ikke noget?

Ny kode:
ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
                cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
                cmdStartInfo.RedirectStandardOutput = false;
/*
                cmdStartInfo.RedirectStandardError = true;
                cmdStartInfo.RedirectStandardInput = true;
                cmdStartInfo.UseShellExecute = false;
                cmdStartInfo.CreateNoWindow = true;

                Process cmdProcess = new Process();
                cmdProcess.StartInfo = cmdStartInfo;
                cmdProcess.ErrorDataReceived += cmd_Error;
                cmdProcess.OutputDataReceived += cmd_DataReceived;
                cmdProcess.EnableRaisingEvents = true;
                cmdProcess.Start();
                cmdProcess.BeginOutputReadLine();
                cmdProcess.BeginErrorReadLine();
*/

                cmdStartInfo.Arguments = "/c " + adbCommand;
Avatar billede arne_v Ekspert
22. februar 2021 - 16:19 #7
Jeg fumler vist rundt.

Det er  naturligvis cmdStartInfo.RedirectStandardInput som skal vaere false ikke output.
Avatar billede chrisrj Forsker
22. februar 2021 - 16:37 #8
Nu kommer der i hvert fald output igen. :)

Og det virker også som om den kører kommandoerne.

Men de bliver stadig "tæsket" af sted.

De skulle gerne kører HELT færdige før den næste sættes igang.
Avatar billede chrisrj Forsker
22. februar 2021 - 16:41 #9
Hvis man nu kunne gøre det sådan, at den venter på outputtet kommer tilbage, så ville det nok være bedst.

Pt. har jeg denne funktion til at udskrive det til konsolen:
static void cmd_DataReceived(object sender, DataReceivedEventArgs e)
        {
            //Console.WriteLine("Output from other process");
            if (!e.Data.Contains("Microsoft"))
            {
                Console.WriteLine("ADB output: " + e.Data);
            }
        }
Avatar billede arne_v Ekspert
22. februar 2021 - 17:09 #10
WaitForExit metoden?
Avatar billede chrisrj Forsker
22. februar 2021 - 17:14 #11
Lol, så fyrer den kun een kommando af. :D
Avatar billede arne_v Ekspert
22. februar 2021 - 20:00 #12
Nu har jeg eksperimenteret lidt og det her virker:


using System;
using System.Diagnostics;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            for(int i = 0; i < 3; i++)
            {
                ProcessStartInfo psi = new ProcessStartInfo();
                psi.FileName = "cmd";
                psi.Arguments = "/c cd";
                psi.UseShellExecute = false;
                Process p = new Process();
                p.StartInfo = psi;
                p.EnableRaisingEvents = true;
                p.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
                p.Start();
                p.WaitForExit();
                Console.WriteLine("*");
               
            }
            Console.ReadKey();
        }
    }
}
Avatar billede chrisrj Forsker
22. februar 2021 - 20:08 #13
Awesome! Det ser sgu ud til at virke! :) :)

Du får et mega vådt - og virtuelt - smækkys lige på trutten! :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester