PowerShell Programm für Erstellung einer Ordnerstruktur durch Aufrufparameter

Joyless

Ensign
Registriert
Okt. 2008
Beiträge
155
Hallo Zusammen,

ich bin ein absoluter Neuling, was dieses Thema angeht, aber evtl. findet jemand die Zeit und Muße mir zu helfen.

Ich benutze in meiner Firma ein Warenwirtschaftsprogramm, in dem mir Tools zur Verfügung gestellt werden, mit denen ich u. a. eigene Arbeitsabläufe erstellen kann. Einer dieser Abläufe ist es, dass durch eine bestimmte Aktion ein Programm / Datei ausgeführt werden kann.

Es ist dann möglich die Programm- und Aufrufparameter zu definieren.

Nun geistert bei mir folgendes im Kopf rum: Ich habe ein Programm, das bei Ausführung einen vordefinierten Ordnerbaum mittels der Aufrufparameter an der korrekten Stelle erstellt.

Bei den Aufrufparametern hätte ich mir vorgestellt, dass der Pfad bis zu dem Ort vordefiniert wird, wo dann das Programm die Ordner erstellen soll.

Hier mal ein Beispiel:

Ich arbeite mit Projekten, die in Jahresordnern abgelegt werden und immer ein feste, fortlaufende Nummer bekommen. Z.B. Jahresordner: 2022 Projektnummer: 220001, 220002, 220003 usw.

Die Jahresordner werden immer manuell von mir angelegt und der Speicherpfad ist immer gleich, z.B. \\server\daten\Projekte\2022

Nun wäre es natürlich genial, wenn ich als Aufrufparameter den Speicherort vorgeben könnte und das Programm dann bei Ausführung dort automatisch die Unterordner erstellt.

D.h. das Programm erstellt mir im Jahresordner den Hauptordner mit der Projektnummer, sowie die entsprechenden Unterordner.

Wäre sowas machbar und könnte ich sowas, evtl. mit powershell programmieren?
 
Moin,

hab hier was zusammengetippt:

PowerShell:
$Continue = $true
while ($Continue) {
    Write-Host ("Pfad angeben? >>> ")
    $PathToCreateFoldersIn = Read-Host
    if ($PathToCreateFoldersIn -like "q") {
        Write-Host "Auf User Wunsch abgebrochen!"
        exit
    }

    $Script:Boundaries = New-Object "System.Collections.Generic.List[object[]]]"
    if (Test-Path $PathToCreateFoldersIn) {
        Write-Host "Schema zum erstellen der Ornder? >>>"
        $Schema = Read-Host
        $MatchesCollection = ([Regex]"\[(0{1,})?\d{1,}-\d{1,}\]").Matches($Schema)
        $CollectionI = 0
        foreach ($Match in $MatchesCollection) {
            $Match.Value -match ".(?<Number1>(\d+)?)-(?<Number2>(\d+)?)." | Out-Null
            $Result = $null
            if ([System.Int32]::TryParse($Matches.Number1, [ref]$Result)) {
                $From = $Result
            }
            else { throw }
            if ([System.Int32]::TryParse($Matches.Number2, [ref]$Result)) {
                $To = $Result
            }
            else { throw }
            $Match.Value -match (".(?<zer0s>0+)?.*") | Out-Null
            $HowManyZeros = $Matches.'zer0s'.Length
            if ($From -gt $To) { $FromB = $From; $From = $To; $To = $FromB }
            $Boundaries.Add(@($HowManyZeros, $From, $To, ($Match.Value.ToString()), ($CurrentCounter = $From), ($Boundaries.Count)))
            $Schema = $([Regex]"\[(0{1,})?\d{1,}-\d{1,}\]").Replace($Schema, "ReplaceSpot-$($CollectionI.ToString())", 1)
            $CollectionI = $CollectionI + 1

            # To kleiner als $CurrentCounter
        }
        :BreakHere while ($Boundaries[0][4] -le $Boundaries[0][2]) {
            $LatestBoundaryInSchema = $Boundaries[-1]
            $CurrentCounter = [ref]($Boundaries[-1][4])
            $To = [ref]($Boundaries[-1][2])
            while ($CurrentCounter.Value -le $To.Value) {
                $TempSchema = $Schema
                $ReplaceI = 0
                foreach ($BoundaryListValue in $Boundaries) {
                    $IntLengthOfCounter = $BoundaryListValue[4].ToString().Length
                    $MaxIntLength = $BoundaryListValue[0] + $BoundaryListValue[1].ToString().Length
                    if ($IntLengthOfCounter -lt $MaxIntLength) {
                        $IntString = ""
                        for ($i = 0; $i -lt (($MaxIntLength - $IntLengthOfCounter)); $i++) {
                            $IntString = "0" + $IntString
                        }
                        $IntString = $IntString + $BoundaryListValue[4].ToString()
                    }
                    else { $IntString = $BoundaryListValue[4] }
                    $TempSchema = $TempSchema.Replace("ReplaceSpot-$($ReplaceI.ToString())", $IntString)
                    $ReplaceI++
                }
                $LatestBoundaryInSchema[4] = $CurrentCounter.Value + 1
                $CurrentCounter = [ref]($Boundaries[-1][4])
                $To = [ref]($Boundaries[-1][2])
                $FullPath = (Join-Path ($PathToCreateFoldersIn) ($TempSchema))
                # [System.IO.Directory]::CreateDirectory($FullPath)
                Write-Host $FullPath
            }
            if ($Boundaries.Count -eq 1) { break BreakHere }
            $Boundaries[-1][4] = $Boundaries[-1][1]
            for ($BoundariesI = $Boundaries.Count - 2; $BoundariesI -ge 0; $BoundariesI--) {
                if ($Boundaries[$BoundariesI][4] -ge $Boundaries[$BoundariesI][2]) {
                    if ($BoundariesI -eq 0) { break BreakHere }
                    $Boundaries[$BoundariesI][4] = $Boundaries[$BoundariesI][1]
                }
                else {
                    $Boundaries[$BoundariesI][4] = $Boundaries[$BoundariesI][4] + 1
                    break
                }
            }
        }
    }
    else {
        Write-Host "Dieser Pfad existiert nicht!"
    }
}


Etwas umständlicher als manch andere Lösung vielleicht, hab auch ein wenig dran getüftelt.

Also bedient wir das ganze wie folgt:

Ausführen und dann einen Pfad eintippern der existiert, dann ein Schema mit Form Pfad123[123-234]\Projekt[3-4] eingeben und dann rattert er alles von Pfad123[123-234] durch und legt darunter Projekt 3 und 4 an. Wenn du bei der ersten der beiden Ziffern nullen voran stellst also z.B. [0000100-102] dann werden die Ordner in Form von 0000101,... benannt :)

Wenn du Fragen hast, frag gerne, gibt bestimmt einfachere oder bessere Lösungen.

Die Stelle wo erstellt wird ist auskommentiert.
 
  • Gefällt mir
Reaktionen: Joyless
Hallo Zusammen,

danke erstmal für die Unterstützung und danke an @Zuviel für die Vorlage. Der Aufwand wäre wirklich nicht nötig gewesen, aber ich nehme das natürlich gerne an.

Ich spiele das die nächsten Tage einmal durch und falls was wäre, würde ich mich nochmal melden, bzw. ich meld mich auch, wenn ichs hinbekommen habe (kann aber etwas dauern :/ )
 
So, ich hab das in der Firma jetzt einem Mitarbeiter übergeben, der sich in solche Dinge schnell reindenken kann und wir haben jetzt eine Lösung, die perfekt funktioniert.

Danke erstmal an @wiflow and @Zuviel beides hat uns wunderbar dabei geholfen.

Hier mal, was wir gemacht haben.

Powershell bekommt von unserem Warenwirtschaftsprogramm den folgenden Aufruparameter: -EP Bypass -NoP -WindowStyle Hidden -file \\Server\pfad\PowerShell-Ordner_Projekte.ps1 -StringParameter "Ordneradresse"

Die Powershelldatei ist dann so aufgebaut:

PowerShell:
#Programm: powershell.exe
#Aufrufparameter: -EP Bypass -NoP -WindowStyle Hidden -file \\Server\pfad\PowerShell-Ordner_Projekte.ps1 -StringParameter "Ordneradresse"

# Definition der Parameter
Param(
     [string]$StringParameter

    
)

            
        
if (!(Test-Path $StringParameter)) {New-Item -Path $StringParameter -ItemType Directory}   


    $FILE = Get-Content "\\Server\pfad\Folder_Projekte.txt"
    foreach ($LINE in $FILE)
    {
            if(!(Test-path $StringParameter\$LINE)) {New-Item -Path $StringParameter\$LINE -Itemtype Directory}
}

Die Folder_projekte.txt enthält dann die kompletten Unterordner, die in dem Hauptordner erstellt werden sollen.

Wenn ich in meinem Warenwirtschaftsprogramm ein neues Projekt anlege, wird mir, sollte noch kein Projektordner vorhanden sein, dieser über die Powershell Datei erstellt
 
Zurück
Oben