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:
Ich bin dankbar für jede Hilfe.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 378944
Url: https://administrator.de/forum/dateinamen-iterieren-vergleichen-und-nach-zeitstaempel-vergleich-verschieben-378944.html
Ausgedruckt am: 28.04.2025 um 09:04 Uhr
6 Kommentare
Neuester Kommentar
Hier mal was fies zusammengehacktes in PowerShell, kein Anspruch auf eleganz 
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
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

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}

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 kleine Anmerkung: Der Parameter von gci -Include funktioniert nur in kombination mit -r