myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Prozesse in Console ausgeben (gefiltert per LINQ-Ausdruck als Parameter)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
dr4g0n76
myCSharp.de-Poweruser/ Experte

avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.880
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland


dr4g0n76 ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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,


Dateianhang:
unknown ProcessList_Minimum.zip (76,29 KB, 191 mal heruntergeladen)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am 14.01.2015 13:30.

14.01.2015 13:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dr4g0n76
myCSharp.de-Poweruser/ Experte

avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.880
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland

Themenstarter Thema begonnen von dr4g0n76

dr4g0n76 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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));

dr4g0n76 hat dieses Bild (verkleinerte Version) angehängt:
StandardProcessOutput.png
Volle Bildgröße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am 08.02.2019 18:48.

14.01.2015 13:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dr4g0n76
myCSharp.de-Poweruser/ Experte

avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.880
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland

Themenstarter Thema begonnen von dr4g0n76

dr4g0n76 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

dr4g0n76 hat dieses Bild (verkleinerte Version) angehängt:
Top5MostConsuming.png
Volle Bildgröße

14.01.2015 13:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dr4g0n76
myCSharp.de-Poweruser/ Experte

avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.880
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland

Themenstarter Thema begonnen von dr4g0n76

dr4g0n76 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Grosse Version angehängt:

ProcessList_Maximum.zip


Dateianhang:
unknown ProcessList_Maximum.zip (142,32 KB, 209 mal heruntergeladen)
30.01.2015 16:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
hans506 hans506 ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.02.2015
Beiträge: 2
Entwicklungsumgebung: .NET 2013
Herkunft: Berlin


hans506 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen Dank. Genau sowas habe ich gesucht.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von hans506 am 17.02.2015 22:01.

17.02.2015 22:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.11.2019 21:38