germanbeast
Goto Top

Dateien per Batch verschieben nach Vorgabe

Hallo zusammen liebe Administrator Gemeinde,

ich benötige ein Script das in einem Ordner checkt ob in diesem Dateien drinnen sind diese sind fortlaufend nummeriert.
Danach soll geschaut werden ob es in einem anderen Ordner die Datei auch schon gibt.


Wenn ja dann soll sie zu einem gewünschten Verzeichnis verschoben werden. Wenn Nein dann soll die Datei im Quell Verzeichnis bleiben.

Hier noch einmal etwas übersichtlicher:

Ordner A = Quell Verzeichnis
Ordner B = Ebenfalls ein Verzeichnis mit den gleichen Datei Typen
Ordner C = Endgültiges Verzeichnis wenn Datei von Ordner A ebenfalls in Ordner B ist.

Sprich in Ordner C kommt dann die Datei von Ordner B hinein.


Im Ordner B und C wird tagesweise noch ein ein überordner angelegt mit dem tagesaktuellem Datum.

Also der Ordner heißt dann 27082020 z.B. und in diesem soll dann die Datei von Ordner B hinein.


Soweit erstmal zum Ablauf bisher habe ich nur das kopieren realisieren können mehr leider nicht.

Vielen Dank im vorraus für eure Hilfestellungen


Beste Grüße

GermanBeast

Content-Key: 599689

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

Printed on: April 28, 2024 at 03:04 o'clock

Member: Doskias
Doskias Aug 27, 2020 at 12:26:34 (UTC)
Goto Top
Moin German Beast,

wieso Batch und nicht PowerShell?

In PowerShell wären es gefühlt ca. 10 bis 15 Zeilen ;)
Außerdem wäre es hilfreich, wenn du uns deinen Code hier zur Verfügung stellst damit sehen können wo der Fehler liegt.

Gruß
Doskias
Member: germanbeast
germanbeast Aug 27, 2020 at 12:33:42 (UTC)
Goto Top
Hey erstmal vielen dank für deine schnelle Antwort.

Powershell bin ich noch nicht all zu fitt drinnen. Aber hier der Code schon mal. Ist ein bisschen gebastelt mit Sachen aus dem Forum.


@echo off
SetLocal EnableDelayedExpansion

set Quelle=C:\Ordner 1
set Ziel=C:\Ordner 2
set count=0


  For /f "Delims=" %%A in ('dir /b "%Ziel%"') do set /a count+=1 >NUL  
  
	

  For /f "Delims=" %%A in ('dir /b "%Quelle%"') do (  
    
    echo Kopiere "%Quelle%\%%A" nach "%Ziel%  
    copy "%Quelle%\%%A" "%Ziel%\  
    )

pause
Member: Dr.Bit
Dr.Bit Aug 27, 2020 at 12:39:45 (UTC)
Goto Top
Kein Ahnung, aber als Tip: Wenn Du es nach Datum sortieren willst nimm besser 2020827. Das wird deutlich übersichtlicher, weil chronologisch nachvollziehbar.

🖖
Member: Doskias
Solution Doskias Aug 27, 2020 at 12:50:15 (UTC)
Goto Top
Ich würde anfangen Power-Shell zu lernen:

hier so mal spontan die Befehle mit denen du das umsetzen kannst:

get-date
get-childitem
test-path
foreach-Schleife

Du müsstest so wie ich das sehe "nur" folgendes machen:

Get-Childitem aus Ordner A
Get-Childitem aus Order B
für jede Datei Aus A prüfen Ob Sie in B ist
Wenn dies der Fall ist pürfen ob ordner mit aktuellem Datum (get-Date) existiert
wenn nicht erstellen
dann Kopiere Datei aus B in diesen Ordner

Etwa so?
Member: germanbeast
germanbeast Aug 27, 2020 at 12:55:22 (UTC)
Goto Top
Uhh, das hört sich doch schon mal sehr gut an. Damit kann ich schon mal was anfangen. Ich werde damit mal etwas basteln ;) . Besten Dank dafür.
Member: germanbeast
germanbeast Aug 28, 2020 at 09:08:40 (UTC)
Goto Top
Habe nun das Script erstellen können und es funktioniert auch alles soweit super.

Bloß kann man sagen Wenn die Datei nicht gleich ist dass sie unangetastet in Ordner 1 bleibt und ebenfalls auch in Ordner 2? Nur wenn sie in Ordner 2 gleich ist soll sie in das Archiv.

$sourceFolder = "C:\Ordner 1"  
$destinationFolder = "C:\Ordner 2"  
$archiveFolder = "C:\Archiv"  

 

$MyDate = Get-Date -Format yyyyMMdd

 

foreach ($sourceFile in (Get-ChildItem -File -Path $sourceFolder))
{
    $destinationFile = Join-Path $destinationFolder\$MyDate $sourceFile.Name

 

    #Prüfen ob die Datei bereits im Zielvereichnis liegt
    if (Test-Path -Path $destinationFile)
    {
        $archiveFile = Join-Path $archiveFolder $sourceFile.Name
        
        # Prüfen ob die Datei bereits im Archiv liegt
        if (Test-Path -Path $destinationFile) # Ja = Kopieren
        {
            
           Write-Host Copying to archive $destinationFile
            Copy-Item -Path $destinationFile -Destination $archiveFolder
            

 

        }
        else # Nein = Datei bleibt
        {
            Write-Host Keine gleichen Dateien Vorhanden
            
            
        }
        
    }
    
}
Member: Doskias
Doskias Aug 29, 2020 at 18:17:32 (UTC)
Goto Top
Wunderbar. Ob 2 Dateien gleich sind, kannst du mit get-filehash recht simpel rausfinden. haswert von Datei 1 nehmen und mit Datei 2 vergleichen. Dann gehts wieder rein in eine IF-Anweisung und fertig ;)
Member: germanbeast
germanbeast Sep 01, 2020 at 09:05:23 (UTC)
Goto Top
Soo, Script nun endlich fertig bekommen an alle die auch gerne so ein Script brauchen, möchte ich das hier zur Verfügung stellen. Habe noch ein paar Schmankerl eingebaut wie z. B. das erstellen eines Ordners mit dem Tagesaktuellem Datum im Archiv Ordner.


$sourceFolder = "Ordner1"  
$destinationFolder = "Ordner2"  

 

$Archiv = "Archiv Ordner"  
 

 

 
$MyDate = Get-Date -Format yyyyMMdd

 

 

 

foreach ($sourceFile in (Get-ChildItem -File -Path $sourceFolder))
{
    $destinationFile = Join-Path $destinationFolder\$MyDate $sourceFile.Name

 

 

 

 
$sourcefile = Join-Path $sourceFolder $sourcefile.Name

 


    #Prüfen ob in Archiv Tagesaktueller Ordner vorhanden ist/ Wenn Nein erstellen.
    if (!(Test-Path $Archiv)) {New-Item -Path $Archiv -ItemType Directory}

 

 

 

    #Prüfen ob die Datei bereits im Zielvereichnis liegt
    if (Test-Path -Path $destinationFile)
    {
        $archiveFile = Join-Path $Archiv $sourceFile.Name
        
        # Prüfen ob die Datei bereits im Ziel liegt
        if (Test-Path -Path $destinationFile) # Ja = Kopieren
        {
            
            
           Write-Host Copying to archive $Archiv
            Copy-Item -Path $destinationFile -Destination $Archiv
            Remove-Item -Path $sourceFile
            
 

 

        }
        else # Nein = Datei bleibt
        {
            
            
        }
        
    }

 

    
}