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-Key: 303110

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

Printed on: April 25, 2024 at 10:04 o'clock

Member: TlBERlUS
Solution TlBERlUS Apr 28, 2016 at 11:38:58 (UTC)
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.
Mitglied: 114757
Solution 114757 Apr 28, 2016 updated at 13:06:51 (UTC)
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
Member: TlBERlUS
TlBERlUS Apr 28, 2016 at 11:59:40 (UTC)
Goto Top
Zitat von @114757:
Feddich.
So einfach sollten wir es doch net machen. Ein wenig Lerneffekt muss doch eintreten face-smile
Member: windelterrorist
windelterrorist Apr 28, 2016 at 12:25:46 (UTC)
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
Mitglied: 114757
114757 Apr 28, 2016 updated at 12:40:42 (UTC)
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.
Member: windelterrorist
windelterrorist Apr 28, 2016 updated at 13:01:31 (UTC)
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
Mitglied: 114757
114757 Apr 28, 2016 updated at 13:07:23 (UTC)
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?
Member: windelterrorist
windelterrorist Apr 28, 2016 updated at 13:25:36 (UTC)
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
Mitglied: 114757
114757 Apr 28, 2016 updated at 13:31:12 (UTC)
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 ...
Member: windelterrorist
windelterrorist Apr 28, 2016 updated at 13:39:46 (UTC)
Goto Top
Da muss ich dich leider enttäuschen... ich vermute diese 2x foreach Schleife schiesst mir irgendwie ins Bein...
Mitglied: 114757
114757 Apr 28, 2016 updated at 13:43:37 (UTC)
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 ...
Member: windelterrorist
windelterrorist Apr 28, 2016 updated at 14:07:31 (UTC)
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!
Member: TlBERlUS
TlBERlUS Apr 28, 2016 at 14:18:52 (UTC)
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.
Mitglied: 114757
114757 Apr 28, 2016 updated at 18:53:10 (UTC)
Goto Top
Dann bitte auch das gelöst nicht vergessen.
Member: windelterrorist
windelterrorist May 20, 2016 at 10:42:45 (UTC)
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
Member: colinardo
Solution colinardo May 20, 2016 updated at 10:54:23 (UTC)
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
Member: windelterrorist
windelterrorist May 20, 2016 at 11:26:01 (UTC)
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
Member: colinardo
Solution colinardo May 20, 2016 updated at 11:32:24 (UTC)
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
Member: windelterrorist
windelterrorist May 27, 2016 at 08:47:31 (UTC)
Goto Top
Was soll ich sagen... perfekt, danke!