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 !!!"
}
}