Ordner-Struktur auslesen

Mal wieder ein Beitrag aus dem Büro-Alltag. Diesmal galt es im Rahmen einer Fileserver-Migration nicht nur die Shares (siehe Artikel Freigaben übertragen) auszulesen.

Export

Hierzu wird auf dem Quell-Fileserver mit folgendem Skript die komplette Ordnerstruktur ausgelesen:

Get-ChildItem -Recurse -Directory "C:\" | Select-Object FullName

Optional kann man die Suchtiefe mit dem Parameter -Depth 1 auch festlegen, bspw. auf maximal 1 Unterordner, dann sieht der gesamte Befehl so aus:

Get-ChildItem -Recurse -Directory "C:\" -Depth 1 | Select-Object FullName

Möchte man das ganze nun noch in eine Datei exportieren, kann man bspw. eine CSV-Datei verwenden und den o.g. Befehl entsprechend erweitern:

Get-ChildItem -Recurse -Directory "C:\" -Depth 1 | Select-Object FullName | Export-Csv C:\TEMP\Test.csv

Bekannte Probleme

Manchmal kann es jedoch vorkommen, dass der Pfad und/oder Dateiname zu lang ist, dann tritt folgender Fehler auf:

In dem Fall kann entweder per Registry oder per GPO eingestellt werden, dass Windows auch mit langen Namen klarkommen soll. Warum Microsoft das nicht mittlerweile per Default macht, ist mir allerdings unklar. Aber immerhin ist bei neuen Systemen der DWORD vorhanden mit Wert “0”.

Per Registry:

Im Pfad “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem” den DWORD-Eintrag “LongPathsEnabled” mit dem Wert “1” anlegen. Anschließend einen Neustart des Systems durchführen.

Per GPO:

Eine neue GPO erstellen, dann im Pfad “Computer Configuration > Administrative Templates > System > Filesystem” den Eintrag “Enable Win32 long paths” auf “Enabled” ändern. Die GPO in verlinken und auf dem Fileserver ein gpupdate /force und Neustart ausführen.

Erfolgreicher Export

Import

Auf dem Ziel-Fileserver mit folgendem Skript die komplette Ordnerstruktur anlegen:

$file_name = "C:\Temp\Test.csv"
(Get-Content $file_name| Select-Object -Skip 1) | Set-Content $file_name

Foreach ($line in Get-Content $file_name){
$line = $line.Trim('"')
$drive_letter = $line.Substring(0, 1) + ":\"
$folderpath = $line.Trim($drive_letter)
#write-host "Driveletter is: $drive_letter . And rest of path is: $folderpath"

# New-Item -path $driveletter -Name $line.Name -Type Directory

    # Create the folder if it doesn't exist
    $check_folder = "$drive_letter" + $folderpath
    # Write-Host "Checking folder for existance: $check_folder -- Please wait ..."
    if (-not (Test-Path -Path $check_folder)) {
        New-Item -Path $check_folder -ItemType Directory
        Write-Host "++ Created folder: $check_folder !!!"
    } else {
        Write-Host "__ Folder already exists: $check_folder !!!"
    }
}

Ronny Böttcher

Microsoft-Systemadministrator seit 2007 und seit 2021 als IT-Consultant bei Bechtle in Deutschland am Standort Mannheim; alle bisherigen Stationen siehe bei "Über mich". In seiner Freizeit bei der Feuerwehr und Modellbahner, zudem gerne am Kochen/Grillen - oder am Essen 😁

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

DSGVO Cookie Consent mit Real Cookie Banner