Die genaue Aufgabenstellung findest du auf Roadmap.sh
// Wie fügt man ein neues Cmdlet ein?
Import-Module .\bin\Debug\net8.0\Task-Tracker-CLI.ddl
// Wie sieht man die verfügbaren Commands meines Cmdlet?
Get-Command -module Task-Tracker-CLI
//Wie holt man sich genauere informatione über einen Command?
Get-Help -full
Cmdlets sind native Powershell-Befehle, keine eigenständig ausführbaren Dateien. Cmdlets werden in Powershell-Modulen gesammelt, die bei Bedarf geladen werden können. Cmdlets können in jeder kompilierten .NET-Sprache oder in der eigentlichen Powershell-Skriptsprache geschrieben werden.
Weitere Informationen findest unter:
- Add, Update, and Delete Tasks
- Einen automatisierten DLL-Import durchführen
- Eine Aufgabe als in Bearbeitung oder erledigt markieren
- Alle Aufgaben auflisten
- List all tasks that are done
- List all tasks that are not done
- List all tasks that are in progress
Start des Projekts. Ich habe eine Console-Anwendung
mit Visual Studio erstellt.
- Noch keine Änderungen oder Features hinzugefügt.
Als ich mir heute die Aufgabe nochmal angeschaut habe. Ist mir aufgefallen das die Befehle im CLI ausgeführt werden und eine Console App nach der Ausführung beendet wird. Also habe ich mich schlau gemacht und herausgefunden das man Cmdlets
bauen kann die man in der Powershell ausführen kann.
Hier sind meine Quellen, aus denen ich das herausgefunden habe:
- Introduction Powershell
- Wichitge Dokumentation = Create a Class Libary Project
- How to write a cmdlet
- Cmdlet Attribute Declaration
- Parameter Attribute Declaration
Also begann ich mein Projekt neu zu bauen. Zuerst habe ich meine Console-App gelöscht und eine Klassenbibliothek erstellt.
Dann musste ich im Nuget Manager
eine Powershell Assembly in meine Lösung einfügen.
Nachdem ich alles installiert hatte, konnte ich damit beginnen, meine Klasse Class1.cs
umzubenennen. Für den Anfang habe ich den Namen so aufgebaut < Verb >< Noun >Cmdlet.cs
ergo. GetTaskCmdlet.cs
Um nun solche Cmdlets zu bauen, benötigt man die System.Management.Annotaions;
, daher musste ich auch die Powershell Assembly im Nuget Manager herunterladen.
using System.Management.Annotation;
Beispielcode: Ich habe ein Testbeispiel mit der Dokumentation von Create a Class Libary Project begonnen..
[Cmdlet(VerbsCommon.Get, "Task")]
[OutputType(typeof(Task))]
public class GetTaskTaskMakerCmdlet : Cmdlet
{
}
Später habe ich mit Hilfe der Anleitung die CLI-Befehlszeilen ausprobiert, um mein Cmdlet
auszuführen. Hier sind die Befehle:
Wie füge ich das Cmdlet in Powershell ein?
Import-Module .\bin\Debug\net8.0\Task-Tracker-CLI.ddl
Wie kann ich die verfügbaren Befehle meines Cmdlets anzeigen?
Get-Command -module Task-Tracker-CLI
Wie erhalte ich genauere Informationen über eine Bestellung?
Get-Help -full
Nachdem ich einige Änderungen vorgenommen habe, funktioniert der Import der DDL
nicht mehr.
Gestern und heute habe ich versucht, meinen Konsolenfehler zu beheben. Leider habe ich im Internet nichts gefunden oder es hat nicht geholfen. Ich habe dann noch ein Nuget Package heruntergeladen in der Hoffnung, dass es damit funktioniert.
Meine Vermutung ist das es vielleicht an meiner Umgebung liegt:
- Visual Studio hat das falsche Framework für Powershell.
- Powershell muss auf dem neuesten Stand sein oder eine ältere Version haben.
Ich habe mich entschieden das Projekt neu zu bauen, um zu sehen ob es noch funktioniert. Es kann gut sein, dass meine DLL
einen Fehler hatte und ich sie in meiner Lösung nicht rekonstruieren konnte.
Folgende Dokumentation befolge ich um zu schauen ob die mir etwas bringt. PowerShell Module als DLL in C# erstellen
Als erstes habe ich festgestellt, dass ich die ganze Zeit die falsche Libary benutzt habe. Es gibt zwei verschiedene Libarys. Eine Libary hat eine .Net Referenz, während die andere eine DLL
ist. 3 mal raten welche ich benutzt habe... Genau die mit .NET...
Dann nahm ich die DLL Libary und installierte meine Nuget Packages die ich brauchte und siehe da, es gab nicht einmal WARNINGS!!!!
Nachdem alles installiert war, habe ich einen kleinen Testcode aus der Dokumentation kopiert und modifiziert.
using System;
using System.Collections.Generic;
using System.Management.Automation;
namespace Task_Tracker
{
[Cmdlet(VerbsCommon.Get, "NITPerf")]
[OutputType(typeof(Task))]
public class TaskTracker : Cmdlet
{
private string myparameter;
private string myparameter2;
private string myparameter3;
[Parameter]
public string Myparameter { get => myparameter; set => myparameter = value; }
[Parameter(ValueFromPipelineByPropertyName = true, ValueFromPipeline = true)]
public string Myparameter2 { get => myparameter2; set => myparameter2 = value; }
[Parameter]
public string Myparameter3 { get => myparameter3; set => myparameter3 = value; }
protected override void ProcessRecord()
{
Random ro = new Random();
List<Task> returnList = new List<Task>();
for (int i = 0; i < 10; i++)
{
var r1 = new Task();
r1.Name = ro.Next().ToString();
r1.Description = ro.Next().ToString();
WriteObject(r1);
}
}
}
}
namespace Task_Tracker
{
public class Task
{
public int TaskID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
}
Dann führte ich meinen Befehl aus, um die generierte DLL einzufügen, und alles funktionierte. !!!! Ich war wie vom Donner gerührt, als ich nichts Rotes mehr sah.
Heute habe ich mir mein Projekt noch einmal angeschaut. Ich habe alles getestet und es funktioniert immer noch. Zuerst habe ich die Kommentare bereinigt, als ich die Methode ausgeführt habe, ist mir aufgefallen, dass die Methode ProcessRecord()
Text in die Powershell schreibt.
protected override void ProcessRecord()
{
WriteObject("Hello World");
}
Mit diesem Wissen rufe ich dann meine JSON-Tasks auf!
Was vielleicht noch in die ToDo-Liste aufgenommen wird, ist die Automatisierung mit der Einbindung der DLL
.
Auf Json-Dateien mit C# zuzugreifen und sie zu bearbeiten ist nicht so einfach, wie ich es mir in einer Klassenbibliothek vorgestellt habe, oder ich stelle mich einfach nur dumm.
Ich bin jetzt so weit, das ich die Json Datei auslesen und in ein C# Objekt umwandeln kann. Wie ich das nun sinnvoll in die Call Methode einbauen kann weiß ich noch nicht.
Ich habe viel recherchiert und bin auf die folgenden Dokumentationen gestoßen:
Letztendlich hat mir diese Dokumentation geholfen, wie ich das jetzt am besten einbauen kann. Link zur Dokumentation (zum besseren Verständnis haben mir alle Dokumentationen geholfen, jeweils ein Codeabschnitt)
Als ich anfing, sollte ich noch ein neues Nuget Package herunterladen, noch unsicher, bin ich stur der einen Doku gefolgt und habe Nuget Package for Newtonsoft.Json heruntergeladen.
Später bemerkte ich, dass dieses Nuget Package mir Building Errors gab, da die Methode anscheinend etwas anders machte. Deswegen habe ich dann das Nuget Package System.Text.Json gefunden.
Um mir den Test zu erleichtern, habe ich meine Bestellung hier aufgeschrieben:
cd '.\Desktop\Priv. Projcets\Task-Tracker-CLI\Task-Tracker\bin\Debug\'
Import-Module .\Task-Tracker.dll
Get-AllTask