b.rat-get.real
Goto Top

Dateinamen iterieren, vergleichen und nach Zeitstämpel - Vergleich, verschieben

Hallo zusammen,
ich bräuchte Hilfestellung bei folgendem Problem:

Ich möchte auf einem Windows 10 Rechner, einen Ordner überwachen in dem ständig .xml und .pdf Dateien importiert werden. Die xml.'s und pdf.'s haben den GLEICHEN Namen (aber für mich unbekannt).
Mein Batch soll folgendes machen:

Der Name und Erstellungsdatum der jeweiligen Datei extrahieren.
Wenn die Namen der .xml und .pdf Dateien übereinstimmen und beide älter als 10 Min. sind, sollen sie in einem anderen Ordner verschoben werden.

Mein Versuch sieht so aus, aber er funktioniert nicht. Weder der String- noch der Zeitstämpelvergleich:

@ECHO OFF

CD "C:\no1\"  

FOR /R %%A IN (*.pdf) DO (	
	SET DatPDF=%%~nA
	SET PathPDF=%%~fA
	SET TimePDF=%%~tA
	
	FOR /R %%B IN (*.txt) DO (
		SET DatTXT=%%~nB
		SET PathTXT=%%~fB
		SET TimeTXT=%%~tB
		
                IF /I %DatPDF% == %DatTXT% (
			IF TimePDF > 10 & TimeTXT > 10 (
				MOVE PathPDF C:\no2\
				MOVE PathTXT C:\no2\
			)
		)
	) 
)

Ich bin dankbar für jede Hilfe.

Content-Key: 378944

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

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

Member: NetzwerkDude
Solution NetzwerkDude Jul 03, 2018 updated at 13:58:10 (UTC)
Goto Top
Hier mal was fies zusammengehacktes in PowerShell, kein Anspruch auf eleganz face-wink

function CompareAndMove {

    param(
    $Folder,
    $Target
    )

    $DateilistePDFs = Get-ChildItem -Path $folder | Where-Object {$_.Name -like "*.pdf"} | Select-Object -Property BaseName  
    $DateilisteXMLs = Get-ChildItem -Path $folder | Where-Object {$_.Name -like "*.xml"} | Select-Object -Property BaseName  
    
    If ($DateilistePDFs -and $DateilisteXMLs) {
    
    
        $Gleich = (Compare-Object -ReferenceObject $DateilistePDFs.BaseName -DifferenceObject $DateilisteXMLs.BaseName -ExcludeDifferent -IncludeEqual).InputObject 
    
        foreach ($Duplicate in $Gleich) {
        
            $PDF = Get-ItemProperty -Path $folder\$Duplicate.pdf
            $XML = Get-ItemProperty -Path $folder\$Duplicate.xml
    
            If (   ($PDF.CreationTime -lt (Get-Date).AddMinutes(-10)) -and ($PDF.CreationTime -lt (Get-Date).AddMinutes(-10))   ) {
                Move-Item -Path $PDF,$XML -Destination $Target
            }

        }
    }

}



function Monitoring {
    param(
    $Folder,
    $Target,
    $timeout = 1000
    )

    $Watcher = New-Object System.IO.FileSystemWatcher $folder
    $StopWatch = New-Object -TypeName System.Diagnostics.Stopwatch
    $StopWatch.Start()

    while($true) {
        $result = $Watcher.WaitForChanged('all', $timeout)  

        if ($result.TimedOut -eq $false){
            CompareAndMove -Folder $Folder -Target $Target
        }
        
        elseif ($StopWatch.Elapsed.Minutes -gt 1){
            CompareAndMove -Folder $Folder -Target $Target
            $StopWatch.Reset()
            $StopWatch.Start()

        }

    }

}

Monitoring -Folder "C:\temp\hierchecken" -Target "c:\temp\hierhinsortieren"  

Einfach die letze Zeile anpassen, der Parameter -Folder den Ordner mitgeben der überwacht werden soll, dem Parameter -Target dahin wohin es verschoben werden soll.
Das Skript checkt den Ordner wenn Dateien verändert werden und zusätzlich alle 60 sekunden

Wie gesagt, ist ziemlich lame geschrieben, ein guter hätte es in 3 Zeilen geschafft face-smile
Mitglied: 136588
Solution 136588 Jul 04, 2018 updated at 11:00:23 (UTC)
Goto Top
Powershell-Einzeiler im Taskplaner würde auch reichen.
gci 'D:\Quelle\*' -Include "*.pdf","*.xml" | group Basename | ?{$_.Count -eq 2 -and $_.Group.LastWriteTime -lt (get-date).AddMinutes(-10) -and $_.Group[1].LastWriteTime -lt (get-date).AddMinutes(-10)} | %{$_.Group | move-item -Destination 'D:\Ziel' -Force}  
Member: NetzwerkDude
NetzwerkDude Jul 04, 2018 at 11:14:40 (UTC)
Goto Top
kleine Anmerkung: Der Parameter von gci -Include funktioniert nur in kombination mit -r
Aber ansonsten viel kompakter als bei mir :D
Mitglied: 136588
136588 Jul 04, 2018 updated at 11:16:04 (UTC)
Goto Top
Zitat von @NetzwerkDude:

kleine Anmerkung: Der Parameter von gci -Include funktioniert nur in kombination mit -r
Nein das stimmt nicht, schau dir mal meinen Pfad genau an, mit angefügtem Sternchen geht das auch ohne -Recurse face-wink.
Member: NetzwerkDude
NetzwerkDude Jul 04, 2018 at 11:17:35 (UTC)
Goto Top
Wieder was gelernt face-smile
Member: b.rat-get.real
b.rat-get.real Jul 05, 2018 at 08:56:20 (UTC)
Goto Top
Hallo zusammen,
zunächst einmal vielen Dank für euere Lösungen, sie funktionieren einwandfrei. Da ich noch in der Ausbildung bin und wir in der Schule Batchprogrammierung durchnehmen hab ich es in Batch versucht, obwohl ich mir schon gedacht habe dass für erfahrene Programmierer nur ein paar Zeilen sein dürften. Leider habe ich bislang noch nicht die nötige Zeit gehabt mich mit PowerShell auseiander zu setzen, obwohl es viel stärker als die DOS-CMD ist. Das sollte ich glaub ich mal tun face-big-smile. Aber dass es ein Einzeiler ist... face-surprise Danke nochmal!! face-big-smile