windelterrorist
Goto Top

Mit PowerShell per CSV-File Ordner erstellen

Hallo zusammen face-smile

Ich habe ein kleines Skript geschrieben...

Es bleibt aber in der csv Datei mit dem Beispiel-Inhalt:
Testordner
ABCD
...

... bei "Testordner", also beim 1. Eintrag, immer stehen und versucht ständig Testordner zu ersellen... wie kann ich in die nächstfolgende Zeile wechseln?


$PathUserList = "C:\Pfad\zur\csv\datei\Ordnerliste.csv"  
$path = "C:\pfad\zum\stammordner\Ordner_erstellen\"  
$input = New-Object -TypeName System.IO.StreamReader($PathUserList);
$file = $input.ReadLine();
$UserList = Import-Csv -Delimiter ";" -Path $PathUserList  

while ($file -ne $null){

    $file = $file.Split(";")  
    $pathtofolder = $path + $file
    mkdir $pathtofolder
}


Danke schonmal und Grüsse
Windelterrorist

Content-ID: 303110

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

Ausgedruckt am: 13.11.2024 um 11:11 Uhr

TlBERlUS
Lösung TlBERlUS 28.04.2016 um 13:38:58 Uhr
Goto Top
Hi,

du musst in die Richtung
$array = gc deineCSV
foreach ($a in $array){
     new-item $a -itemtype directory
}

gehen (grober Code-Schnipsel).

Dieses Schema(muss ausgebaut werden) sollte für jeden Eintrag deiner CSV einen Ordner erstellen.
114757
Lösung 114757 28.04.2016 aktualisiert um 15:06:51 Uhr
Goto Top
Beispiel
CSV--Datei mit den Überschriften in Zeile 1
Ordnername;Spalte2;Spalte3
Ordner1;Test1;Test2
Ordner2;Test3;Test4
Ordner2;Test5;Test6
Ordner3;Test7;Test8

Code:
$csv = Import-CSV 'C:\Ordner\demo.csv -Delimiter ';'  
$csv | %{md -Path $_.Ordnername }
Wenn das kein absoluter Pfad ist der in der Spalte der CSV steht gibst du diesen stattdessen einfach mit
$csv | %{md -Path "C:\Ziel\$($_.Ordnername)" }  
Feddich.

Gruß jodel32
TlBERlUS
TlBERlUS 28.04.2016 um 13:59:40 Uhr
Goto Top
Zitat von @114757:
Feddich.
So einfach sollten wir es doch net machen. Ein wenig Lerneffekt muss doch eintreten face-smile
windelterrorist
windelterrorist 28.04.2016 um 14:25:46 Uhr
Goto Top
Folgende Meldung erscheint:

Geben Sie Werte für die folgenden Parameter an:
Process:

$csv = Import-CSV 'C:\Ordner\demo.csv' -Delimiter ';'   
$csv | %{md "C:\Ziel\$($_.Ordnername)" }  


Gruss
Windelterrorist
114757
114757 28.04.2016 aktualisiert um 14:40:42 Uhr
Goto Top
Wie sieht denn deine CSV überhaupt genau aus ?? Wenn die CSV genau so aufgebaut ist wie ich sie oben gepostet haben funktioniert das einwandfrei, alter Kaffee das ...
Das $_.Ordnername muss natürlich an deine CSV-Überschrift der Spalte angepasst werden.

Bedenke: Import-CSV liefert immer ein Array aus Objekten dessen Eigenschaften (Spalten) du abfragen musst. Wenn dir das irgendwann mal klar ist ist das alles kein Hexenwerk mehr.
windelterrorist
windelterrorist 28.04.2016 aktualisiert um 15:01:31 Uhr
Goto Top
So sieht meine Test-CSV aus:

Ordnername;spalte2
Testordner;aaa
Ordner;bbb
Finanzen;ccc
Geschäftsleitung;ddd
IT;eee
Sekretariat;fff

Die 2. Spalte ist eigentlich unnötig... es sollen mit dem Script ca. 800 Ordner erstellt werden (alle im selben Pfad!).


Meine eigentliche CSV:

Ordnername
Testordner
Ordner
Finanzen
Geschäftsleitung
IT
Sekretariat
114757
114757 28.04.2016 aktualisiert um 15:07:23 Uhr
Goto Top
Wie gesagt geht so einwandfrei ...ansonsten hat deine CSV ein komisches Encoding oder sonst was unreguläres wie z.B. einen nicht erlaubten Namen oder ungültiges Zeichen für einen Ordner.

Installierte Powershell-Version?
windelterrorist
windelterrorist 28.04.2016 aktualisiert um 15:25:36 Uhr
Goto Top
$psversiontable sagt folgendes aus:
PSVersion                      5.0.10586.122                                                            
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                  
BuildVersion                   10.0.10586.122                                                           
CLRVersion                     4.0.30319.42000                                                          
WSManStackVersion              3.0                                                                      
PSRemotingProtocolVersion      2.3                                                                      
SerializationVersion           1.1.0.1
114757
114757 28.04.2016 aktualisiert um 15:31:12 Uhr
Goto Top
Naja du kannst statt dem Alias md es auch so schreiben
$csv  | %{new-item -itemtype Directory -Path "C:\Ziel\$($_.Ordnername)"}  
Kommt auf das selbe drauf raus, oder gib den Parameternamen mal mit an, normalerweise benötigt man den aber nicht da es ein positional parameter ist ...
$csv | %{md -Path "C:\Ziel\$($_.Ordnername)"}  
Wenn das alles bei dir nicht lüppt machst du derb was falsch was wir hier nicht sehen können ...
windelterrorist
windelterrorist 28.04.2016 aktualisiert um 15:39:46 Uhr
Goto Top
Da muss ich dich leider enttäuschen... ich vermute diese 2x foreach Schleife schiesst mir irgendwie ins Bein...
114757
114757 28.04.2016 aktualisiert um 15:43:37 Uhr
Goto Top
Was für 2 Foreach Schleifen ???? Mein Code besteht aus einer einzigen Foreach-Schleife die über alle Objekte der CSV itteriert, und den Ordner der jeweiligen Zeile erstellt, nicht mehr nicht weniger. Mach ich doch 200 mal am Tag, Veräppel mich doch nicht ...
windelterrorist
windelterrorist 28.04.2016 aktualisiert um 16:07:31 Uhr
Goto Top
Hey all good, jodel32, dein Code ist doch perfekt, nur funktioniert er bei mir nicht... keine Ahnung warum...

und wirklich vielen Dank für deine Bemühung!
TlBERlUS
TlBERlUS 28.04.2016 um 16:18:52 Uhr
Goto Top
Zitat von @windelterrorist:

Hey all good, jodel32, dein Code ist doch perfekt, nur funktioniert er bei mir nicht... keine Ahnung warum...
Ansonsten wandel das Ganze einmal in eine txt-Datei um und mach (z.B.)
$array = gc deineDatei
$array # oder irgendeine andere Zahl

Da sollte er dir die entsprechende Zeile aus der Datei (0-basiert) ausgeben. Wenn das funktioniert, hast du ein Array mit dem du die FOR-Schleife verwenden kannst.
114757
114757 28.04.2016 aktualisiert um 20:53:10 Uhr
Goto Top
Dann bitte auch das gelöst nicht vergessen.
windelterrorist
windelterrorist 20.05.2016 um 12:42:45 Uhr
Goto Top
Hi TIBERIUS, sorry, dass ich mich erst jetzt wider melde... Danke viel Mals für deinen Beitrag, hat bei mir prima geklappt!

Ausserdem sehr simpel und funktioniert wie gesagt einwandfrei! dank dir musste ich die über 1000 Ordner nicht manuell erstellen face-big-smile


Vielen Dank & Grüsse
windelterrorist
colinardo
Lösung colinardo 20.05.2016 aktualisiert um 12:54:23 Uhr
Goto Top
Hallo Windelterrorist,

zu deiner Fehlermeldung:
Folgende Meldung erscheint:
Geben Sie Werte für die folgenden Parameter an:
Process:
kann ich folgendes sagen:

Dieser Fehler tritt immer dann auf wenn man die Codezeilen an der falschen Stelle trennt und z.B. statt den obigen Code von Mitglied: 114757 in eine Zeile zu schreiben so trennt:

--> Funktioniert nicht! (man beachte die Position der geschweiften Klammer)
$csv | %
{md -Path "C:\Ziel\$($_.Ordnername)"}  

--> Funktioniert:
$csv | %{
   md -Path "C:\Ziel\$($_.Ordnername)"  
}
--> Funktioniert
$csv | %{md -Path "C:\Ziel\$($_.Ordnername)"}  

Denn wenn du oben mal
1..10 | %
direkt in die Konsole eintippst bekommst du genau die Fehlermeldung die du oben gepostet hast. Typische Anfängerfehler. Auch kann man nicht immer alle Codezeilen wie sie hier gepostet werden direkt in die Konsole posten, häufig ist dazu ein Skript nötig, außer man schreibt es so um das man es als Einzeiler in die Konsole pasten kann.

Grüße Uwe
windelterrorist
windelterrorist 20.05.2016 um 13:26:01 Uhr
Goto Top
Hallo Uwe,

Wow! funktioniert natürlich ebenfalls, vielen Dank für die verständliche Erklärung!

Hätte noch eine zusätzliche Frage... wo müsste ich den Test-path einbauen, um die Ordner jeweils zu testen und wenn sie vorhanden sind, sollen sie nicht erstellt werden?

Ich müsste wie gesagt mehrere 100 Ordner damit erstellen, wenn es nun in der Struktur C:\Ziel\ bereits einen Ordner gibt, welcher in der CSV steht, dann soll dieser nicht erstellt werden... ansonsten erscheint immer "ist bereits vorhanden" face-sad

Vielen Dank schonmal im Voraus.

Grüsse
Windelterrorist
colinardo
Lösung colinardo 20.05.2016 aktualisiert um 13:32:24 Uhr
Goto Top
Zitat von @windelterrorist:
Hätte noch eine zusätzliche Frage... wo müsste ich den Test-path einbauen, um die Ordner jeweils zu testen und wenn sie vorhanden sind, sollen sie nicht erstellt werden?

Ich müsste wie gesagt mehrere 100 Ordner damit erstellen, wenn es nun in der Struktur C:\Ziel\ bereits einen Ordner gibt, welcher in der CSV steht, dann soll dieser nicht erstellt werden... ansonsten erscheint immer "ist bereits vorhanden" face-sad
Entweder du schreibst den Parameter -Force dazu dann ignoriert er es wenn der Ordner schon besteht
$csv | %{md -Path "C:\Ziel\$($_.Ordnername)" -Force}  
oder wenn du es trotzdem mit Test-Path machen willst, hier zwei Varianten
$csv | ?{!(Test-Path "C:\Ziel\$($_.Ordnername)")} | %{md -Path "C:\Ziel\$($_.Ordnername)" -Force}  
oder
$csv | %{
    $path = "C:\Ziel\$($_.Ordnername)"  
    if (!(Test-Path $path)){md $path -Force}
}
Grüße Uwe
windelterrorist
windelterrorist 27.05.2016 um 10:47:31 Uhr
Goto Top
Was soll ich sagen... perfekt, danke!