[Powershell] Dateien nach Dateiendung in Ordner sortieren

xXDanebenXx

Ensign
Registriert
Feb. 2011
Beiträge
216
Hallo liebe Gemeinde,

ich hoffe ich bin hier im richtigen Unterforum :rolleyes:
Ich bin grade ein wenig dabei, Powershell zu lernen und nutze dafür den Kurs der Microsoft-Virtual-Academy ( https://www.microsoftvirtualacademy...insteiger-teil-2-11489?l=zEbGPJnDB_6404984382 ). Ich bin grade ein wenig am Dateimanagement lernen, doch komme irgendwie nicht an dieser einen Aufgabe weiter. Im Vorraus sollte ich simple Dinge tun, wie Dateien nach ihren Endungen sortieren, gruppieren etc.
Eine Aufgabe beinhaltete, mit einer Schleife alle Dateiendungen herauszufinden und dann passende Unterordner zu erstellen, zu jeder Dateiendung. Das habe ich noch geschafft. Nur leider soll ich jetzt eben diese Dateien in die ihnen passenden Unterordner verschieben und ich weiß nicht wie :freak: ich hab es zwar geschafft, jeden Dateitypen einzeln anzusprechen aber ich will das automatisierter haben!
Das meinte ich mit jedem Dateitypen einzeln ansprechen:

PS fk:\> get-childitem -file | foreach-object
{
if ($_.extension -eq ".log") {move $_ .\.log}
elseif ($_.extension -eq ".dat") {move $_ .\.dat}
}

Das funktioniert eben nur bedingt und macht es nicht grade einfach, wenn man viele Dateitypen hat.

vielleicht könnt ihr mir weiterhelfen? :)

Vielen Dank schon mal!
 
In $_.Extension steht die Extension. Warum verschiebst du also nicht nach ".\$($_.Extension)"?
 
Danke erstmal für deine Antwort, aber dafür muss ich aber dennoch jeden Dateitypen einzeln durchgehen oder? :)
 
Code:
PS fk:\> get-childitem -file | foreach-object
{
 move $_ .\$_.extension
}

Sollte für jeden Dateitypen funktionieren, ohne dass du diesen explizit abfragen musst. Bin allerdings kein PS-Experte.
 
xXDanebenXx schrieb:
Danke erstmal für deine Antwort, aber dafür muss ich aber dennoch jeden Dateitypen einzeln durchgehen oder? :)
Warum? Den Dateityp bekommst du doch durchs Iterieren durch den Ordner. Also sag dem Script einfach, verschieb Datei x in den Ordner mit dessen Extension im aktuellen Ordner. Je nachdem was dann alles an Extensions vorhanden ist, wird dafür jeweils ein Ordner erstellt und die Datei dann dort reingeschoben.

Btw: Du kannst auch Aliase benutzen, ist viel kürzer.
Code:
dir -file | % {
  mkdir -Force (".\" + $_.Extension)
  move $_ (".\" + $_.Extension)
}
 
Yuuri bei deinem ersten Vorschlag hat er mir gesagt, dass "Der Quell - und der Zielpfad" nicht identisch sein dürfen

und Fellor der Befehl hat leider nur dazu geführt, dass alle Dateien die endung ".extension" bekommen haben hehe
 
SO damit hat es funktioniert hehe, er schmeißt mir zwar immer noch ne fehlermeldung aber gleichzeitig funktioniert es (er scheint das 2 mal machen zu wollen O.o). Vielen Dank!! :) aber ehrlich gesagt, verstehe ich die Syntax nicht so richtig..
Der Befehl geht jetzt so:
get-childitem -file | ForEach-Object
{
Move-Item $_ ".\$($_.extension)"
}

diese ganzen "$" verwirren mich momentan :freak: :( kann mir da vielleicht jemand das kurz erklären?
 
$ leitet Variablen ein. $_ ist immer das aktuelle Element in einem Scriptblock von ForEach-Object, Where-Object u.ä. $() evaluiert den inneren Term innerhalb eines Strings und nutzt dann dessen Rückgabe. Wenn du Fehler und/oder Warnungen unterdrücken willst, kannst du dies mit den Parametern ErrorAction und WarningAction steuern.
 
Zurück
Oben