[batch] Alle Dateien mit ident. Dateinamen in vorh. Ordner mit ident. Ordnernamen kopieren?

rloxley

Grünschnabel
@comfreak
Ja, das ginge zum Beispiel wie folgt :)
Aber nicht, wenn man sich wahrscheinlich falsch anstellt... :)
Ich habe:
1. den Code im ersten Skript mit diesem ersetzt
2. in der dritten Zeile:
Code:
$_.BaseName -match "^(.*?)(-123|-456)?$" | Out-Null
die Suffixe -123 und -456 entsprechend meiner vorhandenen abgeändert (-Hinz / -Kunz)
3. Das Skript im Ordner c:\test gespeichert und mit Rechtsklick auf "mit Powershell ausführen" gestartet.
Sieht jetzt so aus:
Code:
$rootDirectory = 'C:\test'
$coreFolder = '.Ordner'

# ------------------------------------

cls

# Problem 1
gci $rootDirectory -File | % {
    $_.BaseName -match "^(.*?)(-Hinz|-Kunz)?$" | Out-Null
    $relevantFileName = $matches[1]

    $destinationPath= Join-Path (Join-Path $rootDirectory $_.relevantFileName) $_.Name
    try {
        Move-Item -Path $_.FullName -Destination $destinationPath -ErrorAction Stop
    }
    catch [System.IO.DirectoryNotFoundException] {
        Write-Information "File $_.FullName skipped because no similarly-named directory was found."
    }
}


# Problem 2
gci $rootDirectory -Directory -Exclude $coreFolder | %{
    cp -Path ($rootDirectory, $coreFolder -join '\') -Destination ($_.FullName) -ErrorAction SilentlyContinue
}

Das Powershell-Fenster erscheint kurz (es ist nichts drin zu sehen, keine Fehlermeldung), aber im Ordner hat sich NICHTS getan. KEINE Datei wurde verschoben...
Was habe ich falsch gemacht? :)

@HonniCilest
Code:
Write-Host ('Test-123.jpg' -split '-')[0] # Ausgabe: Test
Wie wende ich das in @comfreak 's Skript an? Entschuldige, das kann ich noch nicht... ;-)

Code:
$rootDirectory = 'C:\test'

gci $rootDirectory -Recurse -File | %{
    mv -Path $_.FullName -Destination (Join-Path -Path $rootDirectory -ChildPath $_.Name)
}
Funktioniert wieder auf Anhieb super. Ich danke Dir :)

Wie meinst Du
bzw. wenn du alle Dateien in deinem 'main' Verzeichnis (siehe Problem 2) ignorieren möchtest:
?
Das habe ich inhaltlich nicht verstanden... :unsure:

Ich meinte nur... "Jetzt hat er es so, wie er wollte - und nun will er es wieder rückgängig machen?"
Zur Erklärung: Der erste Fall ist für NEUE volle Hauptordner, der zweite für BEREITS BESTEHENDE, in denen die Dateien jetzt noch zu überarbeiten sind ;-)

Dankeschön und Viele Grüße
 

HonniCilest

Erfahrenes Mitglied
Wie meinst Du
?
Das habe ich inhaltlich nicht verstanden...

Naja, könnte ja sein, dass du diese Struktur hast
Code:
root
--123
----main
------main.txt
----123.jpg
----123.txt
--456
----main
------main.txt
----456.jpg
----456.txt
und du die main.txt nicht mit in den root verschieben wollen würdest und die main getrennt behandeln willst, z.B. komplett löschen. Die erste Variante würde alle main.txt ebenfalls verschieben. Das ist der Teil, der in deinem Problem 2 in alle Ordner kopiert wurde.

Variante mit Split (aber ungetestet):
Code:
# Problem 1
gci $rootDirectory -File | % {
    $destinationPath= Join-Path (Join-Path $rootDirectory ($_.BaseName -split '-')[0]) $_.Name
    try {
        Move-Item -Path $_.FullName -Destination $destinationPath -ErrorAction Stop
    }
    catch [System.IO.DirectoryNotFoundException] {
        Write-Information "File $_.FullName skipped because no similarly-named directory was found."
    }  
}
 
Zuletzt bearbeitet:

rloxley

Grünschnabel
Ah... alles klar. Super, dass Du das auch mit bedacht hast(y)

Merkwürdig, auch Deine Variante kopiert bei mir GAR KEINE Dateien von "Problem 1", aber den Ordner von "Problem 2"... Problem 1 wird sozusagen einfach "übersprungen", Problem 2 korrekt erledigt... :unsure:

Dabei habe ich im funktionierenden Ausgangs-Skript jetzt mehrmals den Abschnitt "Problem" 1" durch Eure neuen Codezeilen ersetzt. Das mache ich doch nicht immer wieder gleich falsch - oder doch? :eek:

Viele Grüße
 

rloxley

Grünschnabel
Moment, ich ahne vielleicht, warum...
Die Namen der Dateien (und Ordner) enthalten MEHRERE Bindestriche!
Die Struktur entspricht diesem Beispiel:
Ordner:
DokuAfrkia - Teil 1 - 1080p
Dateien:
DokuAfrika - Teil 1 - 1080p.mp4
DokuAfrika - Teil 1 - 1080p.nfo
DokuAfrika - Teil 1 - 1080p.pdf
DokuAfrika - Teil 1 - 1080p-Foto1.jpg
DokuAfrika - Teil 1 - 1080p-Foto2.jpg

Die Suffixe sind also "-Foto1" und "-Foto2"

ENTSCHULDIGT! Ich ging bei der Problemschilderung davon aus, dass Ihr jeweils den GESAMTEN Suffix verwendet, nicht nur den Bindestrich!

Das ist der Fehler, oder?
 
Zuletzt bearbeitet:

HonniCilest

Erfahrenes Mitglied
Ja der Split hat nur den Bindestrich aufgeteilt. Index 0 ist damit "Doku Afrika ", sollte also theoretisch in jenem Ordner landen
 

HonniCilest

Erfahrenes Mitglied
Eure beiden Skripts verschieben KEINE Dateien, nur den Ordner korrekt...

Ich habe auch nur das ComFreak angepasst gehabt. Er hatte einen winzigen Fehler drin, welchen ich damit übernommen habe.

Bitte ändere diese Zeile
$destinationPath= Join-Path (Join-Path $rootDirectory $_.relevantFileName) $_.Name

zu
$destinationPath= Join-Path (Join-Path $rootDirectory $relevantFileName) $_.Name

Verwende dabei die Variante von ComFreak
 

rloxley

Grünschnabel
Habe ich mir gedacht.... ;-)

SO kopiert er jetzt Dateien, ABER er lässt genau all die Dateien MIT SUFFIX aus :cry:
 

HonniCilest

Erfahrenes Mitglied
Kann ich nicht nachvollziehen, mein Test hat wunderbar funktioniert.
Hast du ComFreaks Zeile angpasst?

$_.BaseName -match "^(.*?)(-Hinz|-Kunz)?$" | Out-Null

Bei dem fett Gedrucktem muss Natürlich -Foto1|-Foto2 stehen
 

rloxley

Grünschnabel
Du hast natürlich Recht - es funktioniert einwandfrei! (y) Dankeschön :)

Ich hatte alle "Skriptversuche" vorsichtshalber gespeichert und offenbar doch einen Falschen "korrigiert". Nachdem ich von Grund auf neu angefangen bin, macht es auch genau was es soll :))
So schnell schleichen sich Fehler ein... Entschuldige :rolleyes:

PS: Wenn mir eine Idee zu einem neuen Skript kommt, ist es eigentlich eher gewünscht, dafür jeweils einen eigenen thread zu eröffnen, oder? Bei mir WÜRDE es sich aber wohl fast immer auf genau diese Ausgangslage (Ordnerstruktur etc.) beziehen (ich hatte schon weit vor Anmeldung hier EINIGE Ideen, die mir bei der Arbeit sicher wieder begegnen werden), also schon zu diesem thread passen...
daher frage ich lieber vorher :)

Viele Grüße und nochmal ein herzliches Dankeschön an Euch beide :)