tolgi
Goto Top

Batch Ordner mit Dateinamen erstellen und verschieben

Brauche Hilfe fur eine Ordnerorganisation

Hallo, folgendes Problem habe ich mit Batchprogrammierung,

Ich habe eine Festplatte mit etwa 500 Avi Files und 500 jpg Files.

Dateiname.avi sowie Dateiname.jpg sind jeweils bis auf die Endung exakt identisch.

Nun brauche ich ein Skript und für jeden Avi File einen Ordner mit dem Namen "Dateiname" erstellt und die Dateiname.avi und Dateiname.jpg in diesen Ordner verschiebt.

Beispiel:
RedBull X-Fighters 2009 Mexico AC3.avi und
RedBull X-Fighters 2009 Mexico AC3.jpg sollen beide in den Ordner
RedBull X-Fighters 2009 Mexico AC3 verschoben werden (Ordner muss vorher erstellt werden).

Wäre schn wenn mir da jemand helfen knnte da sich meine Batch kenntnisse echt in grenzen halten.

Vielen Dank im Vorraus für eure Super Hilfe im Forum.

Content-ID: 140211

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

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

bastla
bastla 09.04.2010, aktualisiert am 22.06.2013 um 00:21:30 Uhr
Goto Top
Hallo Tolgi!

Dazu sollte eigentlich
for %i in (D:\Videos\*.avi) do @(md "%~dpi%~ni" && (move "%i" "%~dpi%~ni\" & move "%~dpni.jpg" "%~dpi%~ni\"))
direkt an der Eingabezeile genügen, wobei durch das jeweilige "echo" die Befehle zunächst nur angezeigt werden - wenn Du (alle 3) "echo" weg lässt, werden die Befehle auch ausgeführt.

Solltest Du einen Batch daraus machen wollen, einfach jedes vorkommende Prozentzeichen verdoppeln ...

Noch ein Hinweis: Wenn es (vermutlich) ohnehin nur die ".avi" und die ".jpg" zu einem bestimmten Namen gibt, oder, falls auch noch andere Dateitypen vorhanden wären, diese mit verschoben werden sollen, würde sich die Zeile auf
for %i in (D:\Videos\*.avi) do @(md "%~dpi%~ni" && move "%~dpni.*" "%~dpi%~ni\")
reduzieren.

Grüße
bastla
Tolgi
Tolgi 09.04.2010 um 10:06:50 Uhr
Goto Top
Super, danke. Hat auf anhieb geklappt!
Damit hast du mir nen paar Stunden arbeit erspart. Danke Danke Danke
5t8d1e
5t8d1e 09.04.2010 um 10:48:47 Uhr
Goto Top
Hallo, Tolgi
quick und dirty sieht sollte es so aussehen
SET ziel=C:\temp\backup\
SET quelle=c:\temp\Test_PS

for /f "delims==" %a in ('dir /b "%quelle%"') do if not exist "%ziel%%~na" mkdir "%ziel%%~na"  &&   xcopy "%~na.*" "%ziel%%~na"  

grüße
Torsten

edit: aus den xcopy nen move machen!
bastla
bastla 09.04.2010, aktualisiert am 15.08.2013 um 20:35:25 Uhr
Goto Top
@5t8d1e

So richtig quick wird's vermutilch nicht werden, da bei Deinem Ansatz kopiert und nicht, wie gewünscht, verschoben wird - was sich bei 500 .avi-Files etwas hinziehen könnte ... face-wink

... hinsichtlich des Codes ginge es aber doch noch etwas quicker - "xcopy" erstellt sich den Zielordner nämlich selbst (wird aber vermutlich nicht allzuviel zu tun bekommen, da ein "dir /b" - ohne zusätzliches "/s", was hier aber eher nicht gefrag sein wird - keinen vollständigen Pfad liefert; daher müsstest Du den Pfad schon auch mit angeben - oder, was meist einfacher ist, vorweg per "pushd" in den Quell-Ordner wechseln).

Deine Zeile 4 könnte auf Basis dieser Überlegungen (wenn es beim Kopieren bleiben soll) etwa so aussehen:
for /f "delims=" %a in ('dir /b "%quelle%\*.avi"') do xcopy "%quelle%\%~na.*" "%ziel%%~na\"
Grüße
bastla

[Edit] "edit:" zu spät gesehen -das "Quell-Pfad-Problem" gäbe es aber auch bei "move" ... [/Edit]
5t8d1e
5t8d1e 09.04.2010 um 11:39:07 Uhr
Goto Top
Hallo Bastla

Bei den Code wird natürlich ausgegangen man im Verzeichnis der Quelle ist. Deswegen quick und dirty. Wenn ich sowas sauber haben will würde ich nen PS-script irgenwie vorziehen face-wink


Grüße
Torsten

PS.:das xcopy auch Zielverzeichnise erstellt war mir noch net so bewußt face-wink. Wieder was gelernt

PPS.: nehmt ps1 verdammt cmd/bat!
bastla
bastla 09.04.2010 um 12:01:30 Uhr
Goto Top
Hallo 5t8d1e!
Bei den Code wird natürlich ausgegangen man im Verzeichnis der Quelle ist.
Wenn ich noch etwas den "advocatus diaboli" geben darf: Dann wäre Deine Zeile 2 unnötig ... face-wink
Aber vielleicht magst Du ja die PS-Variante (zur Abrundung des Ganzen) noch hier reinstellen ...

Grüße
bastla
5t8d1e
5t8d1e 09.04.2010 um 14:10:16 Uhr
Goto Top
Ahoi,

*hüstel* naja die zeile 2 sieht halt besser aus ;-=

hier das Script für PS und es ist kein Einzeiler, weil ich die nicht besonders mag
$quelle = "C:\Temp\test_PS"  
$ziel = "C:\Temp\Backup"  

#neues Array mit Dateiinfos aus Quelle
$quelldateien = @(Get-ChildItem $quelle)

foreach ($datei in $quelldateien) {

#Dateiname ohne Extension erstellen    
    $basisname =  (split-path $Datei -leaf).split(".")  

#Testen ob Zielpfad vorhanden ist, ansonsten erstellen
    IF ( Test-Path $ziel\$basisname )
        {} 
    else 
    { New-Item $ziel\$basisname -type directory }

#Testen ob Zieldatei bereits vorhanden ist, ansonsten erstellen
    IF ( Test-Path $ziel\$basisname\$datei )
        { Write-Host "Datei $datei bereits îm Zielverzeichnis vorhanden, wird nicht verschoben" }  
    else
        { Move-Item -Passthru $datei.Fullname -Destination "$ziel\$basisname\$Datei" }  
}

ja ich erwarte Kritik!
Grüße Torsten
Tobmoc
Tobmoc 22.06.2013 um 00:11:02 Uhr
Goto Top
Ich muss hier ein GANZ KLARES DANKE sagen! Ich baue gerade Auktionen und muss über 4000 Dateien sortieren. Ohne euer "Kung-Fu" wäre das einige Wochen arbeit. Somit habe ich das Heute inkl. Photoshop umrechen, anpassen, zuschneiden usw usw in unter 3 Stunden geschaft! Batch rulez!!! DANKE MAN! Wenne ma in Hattingen bis, sach bescheid, das erste Pilz geht auf mich ;)
ponkie
ponkie 11.07.2013 um 23:45:44 Uhr
Goto Top
Hallo Thorsten,
dank Deines Scripts kann ich meine Dateien, die nach "Vorname Nachname" sortiert sind, in Ordner mit der Bezeichnung "Nachname Vorname" kopieren.
Die Zeile schaut dann so aus: $basisname = (split-path $Datei -leaf).split(" ")[1,0]
Absolut perfekt wäre es für mich, wenn ich ein Komma und ein Leerzeichen zwischen Nachname und Vorname einfügen könnte.
Ist mir bisher nicht gelungen. Vielleicht hast Du eine Idee.
Vielen Dank
Ponkie
5t8d1e
5t8d1e 15.08.2013 aktualisiert um 20:34:20 Uhr
Goto Top
Hallo Ponkie,

Ich war lange nicht mehr online und habe erste jetzt dein Post gesehen.
Da ich gerade Zeit, Lust und Langeweile habe, habe ich das Skript ein bissl umgeschrieben
Du kannst das Skript so aufrufen und die Werte vom Parameter übernehmen oder in der Powershell mit neuen Werten aufrufen.
Bsp.: move-Files-custom.ps1 -Source c:\blub -Destination e:\bla -findstring foo -replacestring bar

#move-Files-custom.ps1
Param (
[String]$Source = "Z:\P0w3rsh3ll\Administrator.de\Ponkie\Source",  
[String]$Destination = "Z:\P0w3rsh3ll\Administrator.de\Destination" ,  
[String]$findstring = ' ' ,  
[String]$replaceString = ', '  
)

#get-all Files
#Powershell V3
[array]$myFiles = Get-ChildItem -Path $Source -File
#Powershell V2
#[array]$myFiles = Get-ChildItem -Path $Source | where { $_.PSisContainer -ne $true }
foreach ( $file in $myFiles ) {
    [string]$Basename = $file.Basename
    [string]$newFileName = $file.Name -replace($findstring,$replaceString)
#Check for Destinationpath, if not exist create new Directory
    if ( ( Test-Path "$Destination\$Basename" ) -ne $true )  
        { New-Item -Path $Destination\$Basename -type directory }
#Move File with new Filename, if not exist on destinaton
    if ( Test-Path $Destination\$Basename\$newFileName )
        { Write-Host "File $newFileName already exist, no further action" }  
    else
        {  Move-Item -Passthru $file.Fullname -Destination "$Destination\$Basename\$newFileName" }  
}

In der Hoffnung dass es dir weiter hilft, wie immer alles quick und dirty!

Der Torsten wars!