Ich hatte in letzter Zeit ein paar mal die Möglichkeit Chat-GPT auszuprobieren und habe es auch mal dazu genutzt, mir etwas programmieren zu lassen. In meinen Augen funktioniert das hervorragend, sofern man genau weiß was man will und die Eingabe auch entsprechend gestaltet.

Zielsetzung

Es sollen auf einem lokalen Rechner die seit einer Stunde geänderten Ordner erkannt werden und in einer Sharepoint Liste gespeichert werden.

In einem zweiten Powershell Skript soll ermittelt werden, welche Ordner sich verändert haben und für die darin befindlichen Dateien die Checksumme ermittelt werden. Alle Dateien werden in einer Datenbank gespeichert. Diejenigen Dateien, deren Checksumme sich nicht verändert haben, bekommen ein neues ValidTo Datum, diejenigen, die neu hinzugefügt wurden, werden in der Datenbank ergänzt. Wenn ein Ordner untersucht wurde, soll dies in der SharepointListe ergänzt werden.

Konzept

Umsetzung mit KI / AI

[F] Lese alle Dateien eines Verzeichnisses ein (rekursiv) inklusive der Checksumme.

[A] Um alle Dateien eines Verzeichnisses einzulesen und dabei die Checksumme zu berechnen, kannst du eine rekursive Funktion verwenden, die alle Unterverzeichnisse durchläuft und jede Datei einliest. Hier ist ein Beispiel in Python, das du als Ausgangspunkt nutzen kannst:

Diese Funktion gibt ein Dictionary zurück, das den vollständigen Pfad jeder Datei als Schlüssel und die berechnete Checksumme als Wert enthält. Du kannst die Funktion aufrufen und den Pfad des Verzeichnisses als Argument übergeben, das du durchsuchen möchtest.

Hinweis: In diesem Beispiel wird die SHA-256-Checksumme berechnet, du kannst aber auch eine andere Checksumme berechnen, indem du einen anderen Hash-Algorithmus verwendest (z.B. MD5).

[F] Bitte in powershell.

[A] In PowerShell kannst du ebenfalls eine rekursive Funktion verwenden, um alle Dateien eines Verzeichnisses einzulesen und dabei die Checksumme zu berechnen. Hier ist ein Beispiel, das du als Ausgangspunkt nutzen kannst:

Diese Funktion gibt ein Dictionary zurück, das den vollständigen Pfad jeder Datei als Schlüssel und die berechnete Checksumme als Wert enthält. Du kannst die Funktion aufrufen und den Pfad des Verzeichnisses als Argument übergeben, das du durchsuchen möchtest.

Hinweis: In diesem Beispiel wird die SHA-256-Checksumme berechnet, du kannst aber auch eine andere Checksumme berechnen, indem du einen anderen Hash-Algorithmus verwendest (z.B. MD5). Du kannst auch den Befehl Get-FileHash verwenden, um andere Hash-Algorithmen zu verwenden. Die verfügbaren Algorithmen kannst du mit dem Befehl Get-FileHash -ListAlgorithms auflisten.

[F] Kann man statt dem Dictionary ein Array von PSCustomObject verwenden?

[A] Ja, statt ein Dictionary zu verwenden, kannst du auch ein Array von PSCustomObject-Instanzen erstellen und jedes Element des Arrays mit den gewünschten Eigenschaften füllen. Hier ist eine Anpassung des vorherigen Beispiels, in dem ein Array von PSCustomObject-Instanzen zurückgegeben wird:

Diese Funktion gibt ein Array von PSCustomObject-Instanzen zurück, wobei jedes Element des Arrays die Eigenschaften „Path“ (vollständiger Pfad der Datei) und „Checksum“ (berechnete Checksumme) enthält. Du kannst die Funktion aufrufen und den Pfad des Verzeichnisses als Argument übergeben, das du durchsuchen möchtest.

Hinweis: In diesem Beispiel wird die SHA-256-Checksumme berechnet, du kannst aber auch eine andere Checksumme berechnen, indem du einen anderen Hash-Algorithmus verwendest (z.B. MD5). Du kannst auch den Befehl Get-FileHash verwenden, um andere Hash-Algorithmen zu verwenden. Die verfügbaren Algorithmen kannst du mit dem Befehl Get-FileHash -ListAlgorithms auflisten.

[F] Bitte füge neben Path und Checksum auch noch die Größe der Datei, Created Date, Last Access DAte, Modified Date und die Extension dem PSCustomObject hinzu.

[A] Um neben dem Pfad und der Checksumme auch die Größe, das Erstellungsdatum, das letzte Zugriffsdatum, das letzte Änderungsdatum und die Extension jeder Datei im Array von PSCustomObject-Instanzen abzuspeichern, kannst du folgendes Beispiel verwenden:

Diese Funktion gibt ein Array von PSCustomObject-Instanzen zurück, wobei jedes Element des Arrays die Eigenschaften „Path“ (vollständiger Pfad der Datei), „Checksum“ (berechnete Checksumme), „Size“ (Größe der Datei in Bytes), „Created“ (Erstellungsdatum), „LastAccess“ (letztes Zugriffsdatum), „LastWrite“ (letztes Änderungsdatum) und „Extension“ (Dateierweiterung) enthält. Du kannst die Funktion aufrufen und den Pfad des Verzeichnisses als Argument übergeben, das du durchsuchen möchtest.

Hinweis: In diesem Beispiel wird die SHA-256-Checksumme berechnet, du kannst aber auch eine andere Checksumme berechnen, indem du einen anderen Hash-Algorithmus verwendest (z.B. MD5). Du kannst auch den Befehl Get-FileHash verwenden, um andere Hash-Algorithmen zu verwenden. Die verfügbaren Algorithmen kannst du mit dem Befehl Get-FileHash -ListAlgorithms auflisten.

[F] Übergebe $results nun einer weiteren Funktion mit dem folgenden Parameter SQL-Server, Username, Passwort. Die Funktion soll die StoredProcedure (sp_FileChecksum) aufrufen und $results als User defined Table Type („Files“) übergeben. Der User defined Table Type hat die selben Spalten wie PSCustomObject.

[A] Um $results als User defined Table Type (UDTT) an eine Stored Procedure in einer SQL Server-Datenbank zu übergeben, kannst du folgendes Beispiel verwenden:

Diese Funktion nimmt den Namen des Servers, den Benutzernamen und das Passwort für die Verbindung zum SQL Server sowie das Array von PSCustomObject-Instanzen als Argumente entgegen. Sie erstellt eine Verbindung zum SQL Server, erstellt einen Befehl für die Stored Procedure „sp_FileChecksum“, fügt einen Parameter für das UDTT hinzu und führt schließlich die Stored Procedure aus.

Hinweis: Stelle sicher, dass der User defined Table Type „FilesType“ in der Datenbank existiert und die gleichen Spalten wie das PSCustomObject-Array hat. Du musst möglicherweise die Verbindungszeichenfolge und den Namen der Stored Procedure entsprechend anpassen.

[F] Schreibe mir nun eine Stored Procedure namens „sp_FileChecksum“, die als Inputparameter ein UDTT erwartet mit den Spalten von $results, dass die Daten in eine Tabelle namens „FileChecksum“ speichert.

[A] Hier ist ein Beispiel für eine Stored Procedure namens „sp_FileChecksum“, die als Inputparameter ein UDTT mit den Spalten von $results erwartet und die Daten in eine Tabelle namens „FileChecksum“ speichert:

Diese Stored Procedure erwartet einen Inputparameter mit dem Namen „@Files“ und dem Typ „dbo.FilesType“, der als READONLY markiert ist. Sie leert zunächst die Tabelle „FileChecksum“ und fügt dann die Daten aus dem UDTT in die Tabelle ein.

Hinweis: Stelle sicher, dass der User defined Table Type „FilesType“ in der Datenbank existiert und die gleichen Spalten wie das PSCustomObject-Array hat. Du musst möglicherweise den Namen der Tabelle und des UDTT entsprechend anpassen.

[F] Die Stored Procedure sp_FileChecksum soll nun zusätzlich in die Tabelle das aktuelle Datum als validFrom und validTo schreiben.

[A] Um die Stored Procedure „sp_FileChecksum“ so anzupassen, dass sie zusätzlich das aktuelle Datum als „validFrom“ und „validTo“ in die Tabelle „FileChecksum“ schreibt, kannst du folgendes Beispiel verwenden:

Diese Stored Procedure ist im Wesentlichen gleich wie das vorherige Beispiel, außer dass sie zusätzlich die Spalten „validFrom“ und „validTo“ in der INSERT-Anweisung enthält. „validFrom“ wird mit dem aktuellen Datum gefüllt, während „validTo“ mit NULL initialisiert wird.

Hinweis: Stelle sicher, dass die Tabelle „FileChecksum“ die Spalten „validFrom“ und „validTo“ enthält. Du musst möglicherweise den Namen der Tabelle und des UDTT entsprechend anpassen.

[F] Schreib bitte in das Feld validTo auch die aktuelle Uhrzeit und speichere die Uhrzeit zuvor in einer Variable.Schreib bitte in das Feld validTo auch die aktuelle Uhrzeit und speichere die Uhrzeit zuvor in einer Variable.

[A] Um die Stored Procedure „sp_FileChecksum“ so anzupassen, dass sie zusätzlich das aktuelle Datum und die aktuelle Uhrzeit als „validFrom“ und „validTo“ in die Tabelle „FileChecksum“ schreibt, kannst du folgendes Beispiel verwenden:

Diese Stored Procedure ist im Wesentlichen gleich wie das vorherige Beispiel, außer dass sie zusätzlich die Spalten „validFrom“ und “ {Hier ist wirklich das Ende der Antwort, der Rest fehlt}

[F] Entferne nun das Truncate Table und prüfe stattdessen, ob ein Datensatz mit dem selben Path und Checksum bereits in der Tabelle existiert. Existiert der Datensatz bereits, aktualisiere die Spalte „validto“ ansonst schreibe mit Insert Into den DAtensatz – wie in der aktuellen Stored Procedure – in die Tabelle.

[A] Um die Stored Procedure „sp_FileChecksum“ so anzupassen, dass sie prüft, ob ein Datensatz mit demselben Pfad und derselben Checksumme bereits in der Tabelle „FileChecksum“ existiert, und diesen Datensatz aktualisiert oder einfügt, kannst du folgendes Beispiel verwenden:

Diese Stored Procedure führt zunächst eine UPDATE-Anweisung aus, um bestehende Datensätze in der Tabelle „FileChecksum“ zu aktualisieren. Sie schließt dann eine INSERT-Anweisung an, um neue Datensätze in die Tabelle einzufügen. Die UPDATE-Anweisung aktual {Auch hier ist die Antwort überraschenderweise zu Ende}

[F] Erstelle mit das Create Table Statement für dbo.FileChecksum, das zustätzlich eine Spalte ID vom Type BigInt und eine Spalte UID vom Type uniqueidentifier beinhaltet. Die Spalte ID soll Autoincrement sein und die Spalte UID soll automatisch eine GUID generieren.

[A] Um das Create Table Statement für die Tabelle „dbo.FileChecksum“ zu erstellen, das zusätzlich eine Spalte „ID“ vom Typ BigInt und eine Spalte „UID“ vom Typ uniqueidentifier enthält, kannst du folgendes Beispiel verwenden:

Dieses Create Table Statement erstellt eine Tabelle mit den angegebenen Spalten. Die Spalte „ID“ ist vom Typ BigInt und verfügt über eine IDENTITY-Eigenschaft, die automatisch eine fortlaufende Nummer generiert. Die Spalte „UID“ ist vom Typ uniqueidentifier und verfügt über einen DEFAULT-Wert, der automatisch eine neue GUID generiert. Alle anderen Spalten sind nicht NULL und haben die angegebenen Datentypen.

Hinweis: Du musst möglicherweise den Namen der Tabelle und der Spalten entsprechend anpassen.

[F] Jetzt benötige ich noch das Create Statement der User Defined Table dbo.FilesType

Um das Create Statement für den User Defined Table Type „dbo.FilesType“ zu erstellen, kannst du folgendes Beispiel verwenden:

Dieses Create Statement erstellt einen User Defined Table Type mit den angegebenen Spalten und Datentypen. Stelle sicher, dass die Spalten und Datentypen mit denen in der Tabelle „dbo.FileChecksum“ übereinstimmen. Du musst möglicherweise den Namen des UDTT entsprechend anpassen.

[F] Schreibe mir noch eine Powershell Fuktion, die eine Sharepoint Liste ausliest, welche folgende Spalten beinhaltet „Path“, „Checked“. Als Paramter soll die Funktion den Namen der Liste und den Pfad zur Site beinhalten.

[A] Um eine PowerShell-Funktion zu erstellen, die eine SharePoint-Liste ausliest und die Spalten „Path“ und „Checked“ zurückgibt, kannst du folgendes Beispiel verwenden:

Diese Funktion nimmt den Namen der Liste und die URL der SharePoint-Site als Argumente entgegen. Sie meldet sich bei SharePoint an, ruft die Liste und die Listeneinträge ab und gibt schließlich die Spalten „Path“ und „Checked“ als Ergebnis zurück.

Hinweis: Stelle sicher, dass das SharePoint-Modul installiert und konfiguriert ist. Du musst möglicherweise die URL der SharePoint-Site und den Namen der Liste entsprechend anpassen.

[F] Erweitere die Funktion um die Möglichkeit einen Usernamen und ein Passwort zu übergeben.

[A] Um die PowerShell-Funktion „Get-SharePointList“ so zu erweitern, dass sie die Möglichkeit bietet, einen Benutzernamen und ein Passwort zu übergeben, kannst du folgendes Beispiel verwenden:

Diese Funktion nimmt den Namen der Liste, die URL der SharePoint-Site, den Benutzernamen und das Passwort als Argumente entgegen. Sie erstellt ein Credential-Objekt mit dem angegebenen Benutzernamen und Passwort und meldet sich dann bei SharePoint an. Danach wird die Liste und die Listeneinträge abgerufen und die Spalten „Path“ und „Checked“ werden zurückgegeben.

Hinweis: Stelle sicher, dass das SharePoint-Modul installiert und konfiguriert ist. Du musst möglicherweise die URL der SharePoint-Site, den Namen der Liste und die Anmeldeinformationen entsprechend anpassen.

[F] Erweitere nun die Funktion, dass nur die Elemente ausgelesen werden, bei denen Checked leer ist.

[A] Um die PowerShell-Funktion „Get-SharePointList“ so zu erweitern, dass nur die Elemente ausgelesen werden, bei denen die Spalte „Checked“ leer ist, kannst du folgendes Beispiel verwenden:

[F] Lies bitte auch noch die ID der Sharepoint Elemente aus.

[A] Um die PowerShell-Funktion „Get-SharePointList“ so anzupassen, dass sie auch die ID der SharePoint-Elemente ausliest, kannst du folgendes Beispiel verwenden:

[F] Das Skript ist unvollständig.

[A] Es tut mir leid, dass mein vorheriger Beitrag unvollständig war. Hier ist das vollständige Beispiel für die PowerShell-Funktion „Get-SharePointList“, die die Spalten „ID“, „Path“ und „Checked“ ausliest und nur die Elemente zurückgibt, bei denen die Spalte „Checked“ leer ist:

Hinweis: Stelle sicher, dass das SharePoint-Modul installiert und konfiguriert ist. Du musst möglicherweise die URL der SharePoint-Site, den Namen der Liste und die Anmeldeinformationen entsprechend anpassen.

[F] chreibe mir nun noch eine Funktion, die dieselben Parameter wie „function Get-SharePointList“ beinhaltet und zusätzlich den PAremeter „ID“. Anhand des Parameters ID soll das Element aktualisiert werden und in die Spalte „Checked“ das aktuelle Datum geschrieben werden.

[A] Um eine PowerShell-Funktion zu erstellen, die die gleichen Parameter wie „Get-SharePointList“ enthält und zusätzlich den Parameter „ID“, kannst du folgendes Beispiel verwenden:

Diese Funktion nimmt den Namen der Liste, die URL der SharePoint-Site, den Benutzernamen, das Passwort und die ID des zu aktualisierenden Elements als Argumente entge {Auch hier fehlt wieder ein Teil der Antwort}

[F] Schreibe mir nun eine Powershell Funktion, die ermittelt welche Ordner in dem in der letzten Stunde neue Dateien erzeugt wurden oder bestehende Dateien geändert wurden.

[A] Um eine PowerShell-Funktion zu erstellen, die ermittelt, welche Ordner in den letzten Stunde neue Dateien erzeugt oder bestehende Dateien geändert wurden, kannst du folgendes Beispiel verwenden:

Diese Funktion nimmt den Pfad zum Verzeichnis als Argument entgegen und ermittelt die aktuelle Uhrzeit und die Uhrzeit von vor einer Stunde. Danach werden alle Ordner unter dem angegebenen Pfad abgerufen und gefiltert, bei denen eine Datei in den letzten Stunde erzeugt oder geändert wurde. Schließlich werden die Namen der modifizierten Ordner zurückgegeben.

Hinweis: Du musst möglicherweise den Pfad anpassen und stelle sicher, dass du über die entsprechenden Zugriffsberechtigungen ver {auch hier fehlt ein Teil der Antwort}

[F] Geht das auch über den FileSystemwatcher?

Ja, du kannst auch den FileSystemWatcher verwenden, um zu ermitteln, welche Ordner in den letzten Stunde neue Dateien erzeugt oder bestehende Dateien geändert wurden. Der FileSystemWatcher ist ein .NET-Komponente, die Ereignisse auslöst, wenn sich im beobachteten Verzeichnis etwas ändert. Du kannst ihn verwenden, um Dateien und Verzeichnisse zu überwachen und entsprechende Aktionen auszuführen, wenn sich etwas ändert.

Hier ist ein Beispiel für eine PowerShell-Funktion, die den FileSystemWatcher verwendet, um die Ordner zu ermitteln, bei denen in den letzten Stunde neue Dateien erzeugt oder bestehende Dateien geändert wurden:

[F] Die Funktion ist nicht vollständig.

[A] Es tut mir leid, dass mein vorheriger Beitrag unvollständig war. Hier ist das vollständige Beispiel für eine PowerShell-Funktion, die den FileSystemWatcher verwendet, um die Ordner zu ermitteln, bei denen in den letzten Stunde neue Dateien erzeugt oder bestehende Dateien geändert wurden:

[F] ist leider noch immer nicht vollständig.

[A] Es tut mir leid, dass mein vorheriger Beitrag erneut unvollständig war. Hier ist das vollständige Beispiel für eine PowerShell-Funktion, die den FileSystemWatcher verwendet, um die Ordner zu ermitteln, bei denen in den letzten Stunde neue Dateien erzeugt oder bestehende Dateien geändert wurden:

[F] noch immer nicht.

[A] Es tut mir sehr leid, dass meine vorherigen Beiträge unvollständig waren. Hier ist das vollständige Beispiel für eine PowerShell-Funktion, die den FileSystemWatcher verwendet, um die Ordner zu ermitteln, bei denen in den letzten Stunde neue Dateien erzeugt oder bestehende Dateien geändert wurden:

[F] Kannst du noch den Rest des Skripts ausgeben. Was kommt nach „Register-ObjectEvent -InputObject $watcher -EventName Changed -Action“

[A] Hier ist der Rest des Skripts:

Diese Funktion startet den FileSystemWatcher und wartet, bis das Skript beendet wird. Die modifizierten Ordner werden am Ende der Funktion zurückgegeben.

Du kannst die Funktion wie folgt aufrufen:
> $modifiedFolders = Get-ModifiedFolders -path ‚C:\MyFolder‘

Hinweis: Du musst möglicherweise den Pfad anpassen und stelle sicher, dass du über die entsprechenden Zugriffsberechtigungen verfügst, um auf das Verzeichnis zuzugreifen.

[F] Wie kann man $modifiedFolders in eine Sharepoint liste speichern. Erstelle eine Funktion mit Parametern für die Liste, die Site, Usernamen, PAsswort. Schreibe in die Spalte „Path“ die Werte von $modifiedFolders.

[A] Du kannst die Add-PnPListItem cmdlet verwenden, um ein neues Element in eine SharePoint-Liste hinzuzufügen. Hier ist eine Beispiel-Funktion, die eine SharePoint-Liste aktualisiert und die Werte aus der $modifiedFolders-Liste in die Spalte „Path“ schreibt:

Hinweis: Du musst möglicherweise den Namen der Liste, die URL der Site und die Anmeldeinformationen anpassen und stelle sicher, dass du über die entsprechenden Berechtigungen verfügst, um die Liste zu aktualisieren.

Du kannst auch das Update-PnPListItem cmdlet verwenden, um bestehende Elemente in der Liste zu aktualisieren.

Ich hoffe, dass dies hilfreich war. Lass mich wissen, wenn du weitere Fragen hast.