Aus Exceldatei eine Ordnerstruktur mit PowerShell erstellen
Hallo liebes Administratorforum!
Ich habe in der Arbeit folgendes Problem und benötige Eure Hilfe.
In einem Excelfile stehen in den einzelnen Zellen Wörter drinnen und aus diesen Wörtern soll ein Pfad erstellt werden.
z.B
Zelle A1: Hallo
Zelle B2: wie
Zelle C3: gehts
Zelle D4: dir
Zelle A100: Mir
Zelle B101: gehts
Zelle C102: gut
Der Pfad müsste dann wie folgt aussehen: C:\temp\hallo\wie\gehts\dir bzw C:\temp\Mir\gehts\gut
Das ganze geht aber auf 10359 Zeilen und auf 13 Spalten. Also hier ist eine recht gewaltige und komplexe Ordnerstruktur.
Ich habe die Exceldatei in PowerShell eingebunden, und dachte mir dass ich es mit einer verschachtelten Schleife hinbekomme, doch leider klappt das ganze nicht so einfach.
Diese Struktur wurde aus einer bestehenden abgekupfert, nur wurden hier einzelne Ordner ausgelassen.
Was auch noch zu beachten ist, dass nur die Ordnerinhalte (Files) der letzten Ordner in der Struktur mitkopiert werden dürfen.
Bsp.:
Zelle A1: Auto
Zelle B2: BMW
Zelle B3: AUDI
Zelle B4: VW
Zelle C5: Tiguan
Pfadaufbau wäre wie folgt:
C:\Temp\Auto\BMW\bmwauto.txt
C:\Temp\Auto\AUDI\audiauto.pdf
C:\Temo\Auto\VW\hallo.pdf
C:\Temp\Auto\VW\Tiguan\abc.txt
Jetzt dürfen nur die Inhalte, also Files (*.pdf, *.txt, *....), von BMW, AUDI und Tiguan, aber nicht von VW selbst mitgenommen werden, da diese Ordner die letzten Ordner in der Ordnerstruktur sind.
Doch bevor man hier auch schon die Files kopiert, wäre es schön, wenn man die Ordnerstruktur aus der Excelliste anlegen kann.
Ich hoffe, dass ich es anschaulich genug erklärt habe.
LG
Rikkijooe
Ich habe in der Arbeit folgendes Problem und benötige Eure Hilfe.
In einem Excelfile stehen in den einzelnen Zellen Wörter drinnen und aus diesen Wörtern soll ein Pfad erstellt werden.
z.B
Zelle A1: Hallo
Zelle B2: wie
Zelle C3: gehts
Zelle D4: dir
Zelle A100: Mir
Zelle B101: gehts
Zelle C102: gut
Der Pfad müsste dann wie folgt aussehen: C:\temp\hallo\wie\gehts\dir bzw C:\temp\Mir\gehts\gut
Das ganze geht aber auf 10359 Zeilen und auf 13 Spalten. Also hier ist eine recht gewaltige und komplexe Ordnerstruktur.
Ich habe die Exceldatei in PowerShell eingebunden, und dachte mir dass ich es mit einer verschachtelten Schleife hinbekomme, doch leider klappt das ganze nicht so einfach.
Diese Struktur wurde aus einer bestehenden abgekupfert, nur wurden hier einzelne Ordner ausgelassen.
Was auch noch zu beachten ist, dass nur die Ordnerinhalte (Files) der letzten Ordner in der Struktur mitkopiert werden dürfen.
Bsp.:
Zelle A1: Auto
Zelle B2: BMW
Zelle B3: AUDI
Zelle B4: VW
Zelle C5: Tiguan
Pfadaufbau wäre wie folgt:
C:\Temp\Auto\BMW\bmwauto.txt
C:\Temp\Auto\AUDI\audiauto.pdf
C:\Temo\Auto\VW\hallo.pdf
C:\Temp\Auto\VW\Tiguan\abc.txt
Jetzt dürfen nur die Inhalte, also Files (*.pdf, *.txt, *....), von BMW, AUDI und Tiguan, aber nicht von VW selbst mitgenommen werden, da diese Ordner die letzten Ordner in der Ordnerstruktur sind.
Doch bevor man hier auch schon die Files kopiert, wäre es schön, wenn man die Ordnerstruktur aus der Excelliste anlegen kann.
Ich hoffe, dass ich es anschaulich genug erklärt habe.
LG
Rikkijooe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 394049
Url: https://administrator.de/contentid/394049
Ausgedruckt am: 23.11.2024 um 12:11 Uhr
5 Kommentare
Neuester Kommentar
doch leider klappt das ganze nicht so einfach.
Kein Thema. Sehe das Problem nicht, sorry.Excelwerte über Powershell auslesen und formatieren
Gruß A.
Kommt da noch wat?
Du sollst dir daraus ja nur die Teile entnehmen die du dafür benutzen kannst, logisch das das nicht genau ein fertiges Skript ist. Das was du brauchst findest du darin.
Naja dann hier mal eine mögliche Vorgehensweise:
Mit der Eigenschaft UsedRange des Worksheets holst du dir den tatsächlichen belegten Range der Tabelle, dann machst du eine einfache ForEach-Schleife über die Eigeschaft Rows des Ergebnis-Ranges, in dem du die belegten Spalten (Eigenschaft Cells) mit "\" per -join verbindest und mit dem Root-Pfad des Ausgabeordners kombinierst und das ganze an md übergibst welches dann die Ordner für dich erstellt.
Ich könnte dir hier problemlos ein fertiges Skript hin pappen, aber dann lernst du ja nichts mehr davon (Wenn das Lernen nicht deine Intention sein sollte, kannst du gerne ein fertiges Skript per PN anfragen).
Mit den o.g. Hinweisen solltest du das jetzt aber auch selbst anfertigen können.
Naja dann hier mal eine mögliche Vorgehensweise:
Mit der Eigenschaft UsedRange des Worksheets holst du dir den tatsächlichen belegten Range der Tabelle, dann machst du eine einfache ForEach-Schleife über die Eigeschaft Rows des Ergebnis-Ranges, in dem du die belegten Spalten (Eigenschaft Cells) mit "\" per -join verbindest und mit dem Root-Pfad des Ausgabeordners kombinierst und das ganze an md übergibst welches dann die Ordner für dich erstellt.
Ich könnte dir hier problemlos ein fertiges Skript hin pappen, aber dann lernst du ja nichts mehr davon (Wenn das Lernen nicht deine Intention sein sollte, kannst du gerne ein fertiges Skript per PN anfragen).
Mit den o.g. Hinweisen solltest du das jetzt aber auch selbst anfertigen können.
Servus @Rikkijooe ,
soweit ich dem Text folgen konnte, dein gewünschter Teil der Ordnererstellung (Kommentare siehe Code):
Grüße Uwe
Fragen dazu gerne per PN
soweit ich dem Text folgen konnte, dein gewünschter Teil der Ordnererstellung (Kommentare siehe Code):
# Quelldatei
$quelle = 'D:\autos.xlsx'
# Ordner in dem die Unterordner erstellt werden
$rootPath = 'D:\Autos'
# Excel COM-Objekt erstellen
$objExcel = New-Object -Com Excel.Application
# Mappe öffnen
$wb = $objExcel.Workbooks.Open($quelle)
# Excel verbergen (oder anzeigen mit $true)
$objExcel.Visible = $false
$objExcel.DisplayAlerts = $false
# Ordner erstellen indem alle benutzen Zeilen des Sheets genommen werden und die nicht leeren Spalten dieser mit "\" zusammengefügt werden und mit dem RootPath verheiratet werden.
$wb.Sheets.Item(1).UsedRange.Rows | %{md "$rootPath\$(($_.Cells.Value() | ?{$_ -ne $null}) -join '\')" -Force -Verbose | out-null}
# Dokument schließen
$wb.Close($false) | out-null
$objExcel.DisplayAlerts = $true
# Excel schließen
$objExcel.Quit() | out-null
# Ressourcen freigeben
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)
Fragen dazu gerne per PN