Stell dir vor Du hast eine Verzeichnisstruktur, in der versionsbezogene Konfigurationsdateien für Softwareprojekte abgelegt werden, die dann während eines Build Prozesses in die Solution eingebunden werden sollen.
Eine Verzeichnisstruktur könnte sein:
- deployments
- 1.0.0.0
- 1.0.0.1
- 1.0.0.10
- 1.0.0.11
- 1.0.0.2
- 1.0.0.3
- 1.0.0.4
Liest man jetzt die Unterordner aus dem Verzeichnis umgebung, erhält man automatisch diese Sortierung. Für den Computer sind das einfache Zeichenfolgen. Da die 1 vor der 2 kommt, werden auch 10 und 11 vor der 2 dargestellt. Für den Computer ist das logisch, für den Menschen eher weniger.
Powershell basiert auf dem .net Framework sowie dotnet core. In .net gibt es einen Typen System.Version, mit einem überladenen Konstruktor, der eine Versionsnummer als Zeichenkette entgegen nimmt. Verwendet man diesen Typen, können die Unterordner mit den Versionsnummer korrekt sortiert werden. Dazu folgendes Powershell Skript:
$deploymentFolderPath = "[FOLDERPATH]"
$folders = Get-ChildItem -Path $deploymentFolderPath
$sortedFolders = $folders | sort-object { new-object System.Version($_.Name) }
$sortedFolders[-1]
In der ersten Zeile wird der Pfad zur Verzeichnisstruktur mit den Versionsordnern angegeben.
In Zeile 2 werden die Unterordner zum Pfad gelesen. Wichtig ist, dass tatsächlich nur die Unterordner gelesen werden, und kein rekursiver Lesevorgang durch alle Unterordner stattfindet.
In Zeile 3 wird die Auflistung der Unterordner als Objekte and die Funktion sort-object übergeben. Sort-Object sortiert die Auflistung an Hand der Instanz vom Typ System.Version. Dem Konstruktor wird dabei der Ordnername übergeben. Die sortierte Auflistung nach Versionsnummer wird an eine neue Auflistung übergeben.
In Zeile 4 wird der letzte Eintrag aus der neuen Auflistung gelesen. Der Index -1 meint den letzten Eintrag in der Auflistung.
Powershell gibt in der Konsole die letzte Version aus: 1.0.0.11.
Das PowerShell Snippet eignet sich gut in automatisierten Build Prozessen, in denen Informationen zur aktuellsten Version in einen Build eingebunden werden müssen.
Wenn ich damit helfen konnte, lass einen Kommentar da.
Viele Grüße,
Olli