myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Gemeinschaft (https://www.mycsharp.de/wbb2/board.php?boardid=64)
-- .NET-Komponenten und C#-Snippets (https://www.mycsharp.de/wbb2/board.php?boardid=67)
--- Prozesse in Console ausgeben (gefiltert per LINQ-Ausdruck als Parameter) (https://www.mycsharp.de/wbb2/thread.php?threadid=113604)


Geschrieben von dr4g0n76 am 14.01.2015 um 13:15:
  Prozesse in Console ausgeben (gefiltert per LINQ-Ausdruck als Parameter)
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.:

Code:
1:
ProcessList "from process in processes orderby process.ProcessName select process" /l

oder

Code:
1:
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.

C#-Code:
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";
        }
    }
}

C#-Code:
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,


Geschrieben von dr4g0n76 am 14.01.2015 um 13:29:
 
Ausgabe mit folgender Definition:

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

in processOutputDefinitionCode.cs steht:

C#-Code:
Console.WriteLine(Verbose(_process));


Geschrieben von dr4g0n76 am 14.01.2015 um 13:58:
 
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:

Code:
1:
2:
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

C#-Code:
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.


Geschrieben von dr4g0n76 am 30.01.2015 um 16:51:
 
Grosse Version angehängt:

ProcessList_Maximum.zip


Geschrieben von hans506 am 17.02.2015 um 22:00:
 
Vielen Dank. Genau sowas habe ich gesucht.


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 02.04.2020 08:52