rikkijooe
Goto Top

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

Content-ID: 394049

Url: https://administrator.de/contentid/394049

Ausgedruckt am: 23.11.2024 um 12:11 Uhr

137846
137846 28.11.2018 aktualisiert um 14:59:06 Uhr
Goto Top
doch leider klappt das ganze nicht so einfach.
Kein Thema. Sehe das Problem nicht, sorry.
Excelwerte über Powershell auslesen und formatieren

Gruß A.
137846
137846 28.11.2018 aktualisiert um 17:32:07 Uhr
Goto Top
Kommt da noch wat?
Rikkijooe
Rikkijooe 28.11.2018 um 17:52:32 Uhr
Goto Top
Servus!

Vielen Dank für Deine Antwort. Leider ist es nicht das wonach ich suche.

LG
Rikkijooe
137846
Lösung 137846 28.11.2018 aktualisiert um 18:59:50 Uhr
Goto Top
Zitat von @Rikkijooe:
Vielen Dank für Deine Antwort. Leider ist es nicht das wonach ich suche.
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.
colinardo
Lösung colinardo 05.12.2018 aktualisiert um 16:46:47 Uhr
Goto Top
Servus @Rikkijooe ,
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)
Grüße Uwe

Fragen dazu gerne per PN