Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Prozesse in Console ausgeben (gefiltert per LINQ-Ausdruck als Parameter)
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

Prozesse in Console ausgeben (gefiltert per LINQ-Ausdruck als Parameter)

beantworten | zitieren | melden

Beschreibung:

Vorneweg:

Das entsprechende Projekt ist an diesen Beitrag angehängt.
Es heisst deswegen Minimum, da es auch noch einen Befehl gibt der Wildcards und String-Matches unterstützt.
Wenn Bedarf besteht, poste ich hier natürlich gerne die "GROSSE" Version.

Mit diesem Kommandozeilentool können Prozesse ausgegeben werden.
Es entspricht in etwa der Funktion von Tasklist (s. Tasklist).

Es gibt 2 Dinge die verändert werden können:

Besonderheiten:

Ihr könnt LINQ-Ausdrücke als Parameter angeben, also z.B.:
ProcessList "from process in processes orderby process.ProcessName select process" /l

oder
ProcessList NameOrderedProcessList.txt /lf

dann wird der LINQ-Ausdruck aus dem entsprechenden File ausgelesen.

Zudem gibt es die Datei processOutputDefinitionCode.cs in der die Ausgabe definiert werden kann.

Die Technik dazu habe ich schon einmal in

[gelöst] Lambda Funktionen in einem Script bzw. zur Laufzeit kompilierten Code.

beschrieben, um Werte an zur Laufzeit kompilierten Code übergeben und wieder zurückbekommen zu können.

Hier in der LINQ-Action Klasse wird der LINQ Befehl zur Laufzeit kompiliert.
Dann kann über die Schnittstelle IScript.Run(CNode node) der LINQ Befehl aufgerufen werden.
Dort gibt es eine Schleife in der die Prozesse aufgelistet werden.
Die Ausgabe des Prozesses folgt aus dem 2. Script.

Untenstehend die Linq-Action Klasse und die LinqScript Klasse.


using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;

namespace ProcessList
{
    /// <summary>
    /// This implements the Gem.
    /// </summary>
    public class LinqAction : ConsoleAction
    {
        public override List<Process> Match(string linqExpression)
        {
            try
            {
                //See this class to see how it's done. Linq statement compiling during runtime.
                LinqScript scriptProcessLinq = new LinqScript(
                    "Test", linqExpression, 
                    "System.Core.dll", 
                    "mscorlib.dll", 
                    "system.dll", 
                    "ProcessList.exe", 
                    "System.Windows.Forms.dll");

                //Run runtime compiled script here, and return value 
                object ids = scriptProcessLinq.Run();

                //show what we got.
                IEnumerable processes = (IEnumerable)ids;
                foreach (object process in processes)
                {
                    OutputScriptSingleton.Instance.Run(new CNode(process));
                    this.m_aProcessList.Add((Process)process);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            return m_aProcessList;
        }

        public override string GetConsoleParameter()
        {
            return "l";
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProcessList
{
    public class LinqScript : CScript
    {
        private string m_sQuery = string.Empty;

        public LinqScript(string _sName, string sQuery, params string[] _aReferencedAssemblies)
            : base(_sName, _aReferencedAssemblies)
        {
            this.m_sFullSource =
@"using ProcessList;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
namespace MyProgram
{
    public class Test : IScript
    {
        public object Run(CNode node)
        {
            Process[] processes = Process.GetProcesses();
            var results = {0};
            return results;
        }
    }
}";

            m_sQuery = sQuery;
            this.m_sFullSource = this.m_sFullSource.Replace("{0}", m_sQuery);

            Compile(_aReferencedAssemblies);
        }

        public override object Run()
        {
            IScript script = m_CompilerResults.CompiledAssembly.CreateInstance("MyProgram." + m_sName) as IScript;
            object ids = script.Run(new CNode("egal"));
            return ids;
        }
    }
}


Benutzt Techniken u.a. aus:

[gelöst] Lambda Funktionen in einem Script bzw. zur Laufzeit kompilierten Code.

Command Line, Kommandozeile, Prozess,
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Ausgabe mit folgender Definition:

ProcessList /l "from process in processes orderby process.Id select process"

in processOutputDefinitionCode.cs steht:


Console.WriteLine(Verbose(_process));
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Jetzt können wir andere Parameter ausprobieren.

Das nächste Statement sollte die 5 Prozesse ausgeben, die am meisten Speicher verbrauchen. Angenommen das LINQ-Statement stimmt, erhalten wir sie auch:

ProcessList "(from p in System.Diagnostics.Process.GetProcesses() orderby p.PrivateMemorySize64 descending 
select p).Skip(0).Take(5).ToList()" /l

Zusätzlich ändern wir den Code in der Datei oben ab ( in processOutputDefinitionCode.cs):

auf

Console.WriteLine(_process.ProcessName + " " + _process.Id);

Da das alles zur Laufzeit geschieht, brauchen wir nichts neu kompilieren.
Nur Parameter und Datei ändern.

Natürlich könnten wir auch diesen Parameter von der Konsole übergeben, aber erstens wird das unübersichtlich Anführungszeichen zu escapen und evtl. zu lang für die Konsole.
Wer will kann das natürlich gerne einbauen.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Grosse Version angehängt:

ProcessList_Maximum.zip
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
hans506
myCSharp.de - Member



Dabei seit:
Beiträge: 2
Herkunft: Berlin

beantworten | zitieren | melden

Vielen Dank. Genau sowas habe ich gesucht.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von hans506 am .
private Nachricht | Beiträge des Benutzers