spsman
Goto Top

Powershell Dateien in nummerische Ordner kopieren

Hallo,

ich habe folgendes vor:
Ich habe einen Ordner: C:\MP3_Dateien

in dem liegen Dateien:

abc_1
abc_2
...
abc_16

Zusätzlich habe ich einen USB-Stick(U:\) mit Folgenden Ordnern

1
2
3
4
5

Jetzt will ich das die Dateien [abc_1...16] in einzelne Ordner
Also:

G:\501\abc_1
G:\502\abc_2
...
G:\516\abc_16

Dazu dachte ich muss erstmal herausfinden wie der letzte Ordner heißt Allerdings finde ich den Fehler noch nicht in folgendem Skript:

$folderprefix =""  
gci|where {$_.mode -eq "d-----"}| ForEach-Object{$_.Name}|sort |$folderprefix = $_[-1]  


$folderprefix

Hab Ihr eine Idee?

Content-ID: 3722844694

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

Ausgedruckt am: 19.12.2024 um 10:12 Uhr

3714160434
3714160434 22.08.2022 um 16:44:49 Uhr
Goto Top
$ordner = 'C:\MP3_Dateien'  
$ziel = 'U:'  
Get-ChildItem $ordner -File | copy-item -Destination {(md "$ziel\$($_.Basename.split('_')[-1])" -Force).FullName}  
SPSman
SPSman 22.08.2022 um 18:55:01 Uhr
Goto Top
Zitat von @3714160434:

$ordner = 'C:\MP3_Dateien'  
$ziel = 'U:'  
Get-ChildItem $ordner -File | copy-item -Destination {(md "$ziel\$($_.Basename.split('_')[-1])" -Force).FullName}  

Hi und Danke,

in dem Script werden Ordner "1"-"x" angelegt und die Dateien kopiert.
Ich versteh auch was darin passiert, jetzt fehl jedoch noch der Teil mit dem Ordner-"Prefix", also das die alten Ordner nicht überschrieben werden
und die führende Nullen.<- Da muss ich nochmal kramen das hatte ich Iwo schonmal..
3714160434
Lösung 3714160434 22.08.2022 aktualisiert um 23:01:56 Uhr
Goto Top
Zitat von @SPSman:

Zitat von @3714160434:

$ordner = 'C:\MP3_Dateien'  
$ziel = 'U:'  
Get-ChildItem $ordner -File | copy-item -Destination {(md "$ziel\$($_.Basename.split('_')[-1])" -Force).FullName}  

Hi und Danke,

in dem Script werden Ordner "1"-"x" angelegt und die Dateien kopiert.
Ich versteh auch was darin passiert, jetzt fehl jedoch noch der Teil mit dem Ordner-"Prefix", also das die alten Ordner nicht überschrieben werden
und die führende Nullen.<- Da muss ich nochmal kramen das hatte ich Iwo schonmal..

$ordner = 'C:\MP3_Dateien'  
$ziel = 'U:'  
$prefix = 1
while((Get-ChildItem "$ordner\${prefix}_*" -Directory)){$prefix++}  
Get-ChildItem $ordner -File | copy-item -Destination {(md "$ziel\$prefix_$($_.Basename.split('_')[-1].padleft(2,'0'))" -Force).FullName}  
SPSman
Lösung SPSman 23.08.2022 um 21:05:46 Uhr
Goto Top
Hi,
$ordner = 'C:\MP3_Dateien'  
$ziel = 'U:'  
$prefix = 1
while((Get-ChildItem "$ordner\${prefix}_*" -Directory)){$prefix++}  
Get-ChildItem $ordner -File | copy-item -Destination {(md "$ziel\$prefix_$($_.Basename.split('_')[-1].padleft(2,'0'))" -Force).FullName}  

Danke, ich habe das noch ein wenig abgeändert jetzt gehts:
$folderprefix =""  
$ziel = 'U:'  
$ordner = 'E:\Temp_HB'  
gci "$ziel\*" -Directory|sort| ForEach-Object{$folderprefix=$_.Name}  
$folderprefix
Get-ChildItem $ordner -File | copy-item -Destination {(md "$ziel\$folderprefix$($_.Basename.split('_')[-1].padleft(2,'0'))" -Force).FullName}  
3714160434
3714160434 23.08.2022 aktualisiert um 22:33:21 Uhr
Goto Top
Ist zwar Bullshit, aber ich muss es ja Gott sei Dank nicht nutzen 😄
SPSman
SPSman 24.08.2022 um 21:44:10 Uhr
Goto Top
Zitat von @3714160434:

Ist zwar Bullshit, aber ich muss es ja Gott sei Dank nicht nutzen 😄
Aloa,
im Gegensatz zu deinem Script, tut es aber das was gefordert war :O
Du darf gerne Verbesserungsvorschläge geben. Bin Lernwillig ;)
SPSman
SPSman 07.10.2022 um 12:50:27 Uhr
Goto Top
Aloa,
ich habe das Script nachmals überarbeitet da spätistens wenn 2 Dateien (abc_1 & xyz_1) im Quellordner sind, diese beide im Zielordner 01 landen, oder die Dateien Abc,def,ghi... heißen es komplett chaos gibt.

Deshalb jetzt Folgendes Script:
#Get-Folder ist eine eigene Funktion
$quellFolder = Get-Folder("C:\00_Tmp_HB")  
$zielFolder = Get-Folder("j:\")  
$folderprefix =""  

gci "$zielFolder\*" -Directory|sort| ForEach-Object{$folderprefix=$_.Name}  
$i=01
# Dateien laden
$FileObjList = Get-ChildItem $quellFolder -File
# Dateiliste durchgehen
foreach ($file in $FileObjList) {
#Ursprungsdatei definieren
$from = "$quellFolder\$file"  
#Zielpfad definieren
$to = "$zielFolder\$folderprefix"  
$to+=$i.ToString().padleft(2,'0')  

#Write-Output "$from\$to" 
#Zielordner erstellen
md $to
#Dateikopieren
Copy-Item $from -Destination "$to\$file"  
$i++

}