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.
Please also mark the comments that contributed to the solution of the article
Content-Key: 378944
Url: https://administrator.de/contentid/378944
Printed on: April 28, 2024 at 06:04 o'clock
6 Comments
Latest comment
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