lesclaypool
Goto Top

Batch Script - Dateien eines best. Zeitraumes zusammenzählen

Hallo zusammen,

vorweg: ich habe wenig, bis keine Ahnung vom batch scripting. Alles was ich im Internet an Lösungen gefunden habe, ist nicht wirklich das Richtige und/oder ich kann es nicht für meine Zwecke ummodeln...

Aufgabenstellung:
Ich habe mehrere Ordner auf einem Netzwerklaufwerk, in denen nur aktuelle Dateien als PDFs abgespeichert werden. Die Aktualität dieser PDFs wird über das Änderungsdatum definiert und können mehrere Jahre zurückreichen. In diesen Ordnern gibt es jeweils einen Unterordner für archivierte Dateien, der keine Berücksichtigung finden soll.

Ich möchte nun in der Lage sein, mir die monatliche Summe der PDFs eines Jahres, aus allen Ordnern auszugeben.
Also ca. so:

Ordner1: 01.2017 - 2400 Dateien
02.2017 - 3000 Dateien
03.2017 - etc...

Ordner2: .....
Ordner3: .....

Alternativ könnte ich mir auch vorstellen, dass am Anfang abgefragt wird, wo und in welchem Zeitraum die PDFs gesucht werden sollen.
Liese sich das irgendwie realisieren ? Falls das zu aufwändig ist, was gäbe es noch für Möglichkeiten ?
Wie gesagt, ich habe nicht wirklich einen Durchblick, bin aber schon willens mich da einzuarbeiten...

Danke und viele Grüße,
Oli

Content-Key: 347582

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

Printed on: April 23, 2024 at 18:04 o'clock

Mitglied: 133883
133883 Aug 29, 2017 updated at 09:29:52 (UTC)
Goto Top
Powershell
gci 'c:\ordner' -Filter *.pdf | group {$_.LastwriteTime.toString('MM\.yyyy')} | select Name,Count  
Gruß
Member: lesclaypool
lesclaypool Aug 29, 2017 at 11:46:43 (UTC)
Goto Top
Vielen Dank, nur soll das auf meinem Firmenrechner laufen und es scheint leider so, als ob PS Scripte nicht zulässig sind. Es kommt auf jeden Fall eine Fehlermeldung:
Die Datei "C:\Users\XXX\Documents\Eigene Programme\pdfcount.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen
erhalten Sie mit "get-help about_signing".
At line:0 char:0
Trotzdem Vielen Dank !

Gibt's nicht noch eine andere Lösung ?
Member: lesclaypool
lesclaypool Aug 29, 2017 at 15:21:05 (UTC)
Goto Top
Folgendes habe ich probiert und geht in die richtige Richtung:
@echo off
cd Ordner1
setlocal enabledelayedexpansion
set /p "inp=Month [MM]: "  
for %%i in (*) do (
  set "dt=%%~ti"  
  if "!dt:~3,2!"=="%inp%" echo %%i  
)
pause

was muss ich hier verändern, damit auch das Jahr Berücksichtigung findet und die Dateien nicht einfach nur aufgelistet, sondern addiert werden ?
Gruß,
Oli
Mitglied: 133883
Solution 133883 Aug 29, 2017 updated at 16:06:31 (UTC)
Goto Top
Immer diese Oldtimer Sonderwünsche:
@echo off & setlocal ENABLEDELAYEDEXPANSION
for %%a in ("C:\Ordner\*.pdf") do (  
    set "tm=%%~ta"  
    set /a "Datum:!tm:~3,7! += 1"  
)
set | findstr "^Datum:[0-1][0-9]\.[1-2][0-9][0-9][0-9]"  
Member: lesclaypool
lesclaypool Aug 29, 2017 at 17:56:41 (UTC)
Goto Top
Herzlichsten Dank, ich bin begeistert !!
Gruß,
Oli
Member: lesclaypool
lesclaypool Aug 31, 2017 at 09:17:04 (UTC)
Goto Top
Hallo,

jetzt muß ich doch nochmal einhaken, denn so wirklich haut das leider doch nicht hin
Leider stimmen die Ergebnisse nicht...
In einem Ordner liegen 7 PDFs mit datum 08.2017 und 1 PDF mit datum 08.2016

Mit folgendem Code:
@echo & setlocal ENABLEDELAYEDEXPANSION
for %%a in ("C:\Users\Public\Documents\*") do (  
    set "tm=%%~ta"  
    set /a "Datum:!tm:~3,8! += 1"  
)
set | findstr "^Datum:[0-1][0-9]\.[1-2][0-9][0-9][0-9]"  
pause


werden die 7 aus 2017 gefunden und mit:

@echo off & setlocal ENABLEDELAYEDEXPANSION
for %%a in ("*.pdf") do (  
    set "tm=%%~ta"  
    set /a "Datum:!tm:~3,7! += 1"  
)
set | findstr "^Datum:[0-1][0-9]\.[1-2][0-9][0-9][0-9]"  
pause

wird das 1 aus 2016 gefunden.

Das habe ich nur als Test gemacht, die Ordner, die ich eigentlich durchforsten will haben z.T. mehr als 15000 PDFs und da kommen die wildesten Ergebnisse raus...
Vielleicht sollte ich noch erwähnen, daß der Dateiname der pdfs größtenteils nur aus Zahlen besteht und auch u.a. das Datum beinhaltet, wie z.B.:

ME.402960_1435467_201708290915

Macht das etwas aus ?

Gruß,
Oli
Mitglied: 133883
133883 Aug 31, 2017 updated at 11:30:48 (UTC)
Goto Top
Leider stimmen die Ergebnisse nicht...
Kann ich nicht nachvollziehen, hier Testordner mit 30000 Dateien erstellt, laufen lassen, exaktes Ergebnis.
!tm:~3,8!
Ist ja auch falsch es soll ja auch nur Monat plus Punkt plus Jahr erfasst werden (7 Stellen), du nimmst hier ein Leerzeichen mit. Vorraussetzung ist hier ein deutsches eingestelltes Datumsformat dd.mm.yyyy in der Ausgabe (Regionsoptionen des Rechners).
Vielleicht sollte ich noch erwähnen, daß der Dateiname der pdfs größtenteils nur aus Zahlen besteht und auch u.a. das Datum beinhaltet, wie z.B.:
Macht das etwas aus ?
Nein die kommen hier ja überhaupt nicht zur Anwendung.
Member: lesclaypool
lesclaypool Aug 31, 2017 at 11:38:17 (UTC)
Goto Top
Ok, inzwischen hab ich folgendes herausgefunden:
Wenn ich den einzelnen Code auf einen der gewünschten Netzwerkordner anwende:

@echo off & setlocal enabledelayedexpansion
for %%a in ("\\server\name\pfad\pfad\pfad\Ordner1\*.pdf") do (  
    set "tm=%%~ta"  
    set /a "Datum:!tm:~3,7! += 1"  
)
set | findstr "^Datum:[0-1][0-9]\.[1-2][0-9][0-9][0-9]">"\\server\name  

\pfad\pfad\pfad\Summe1.txt"  

funktioniert es.

Da ich aber 6 Ordner habe, habe ich obigen code einfach hintereinander gesetzt und jeweils den pfad zum ordner angepasst. Es wird dann auch entsprechend in eine neue .txt gespeichert also so:
@echo off & setlocal enabledelayedexpansion
for %%a in ("\\server\name\pfad\pfad\pfad\Ordner1\*.pdf") do (  
    set "tm=%%~ta"  
    set /a "Datum:!tm:~3,7! += 1"  
)
set | findstr "^Datum:[0-1][0-9]\.[1-2][0-9][0-9][0-9]">"\\server\name\pfad\pfad\pfad\Summe1.txt"   

for %%a in ("\\server\name\pfad\pfad\pfad\Ordner2\*.pdf") do (  
    set "tm=%%~ta"  
    set /a "Datum:!tm:~3,7! += 1"  
)
set | findstr "^Datum:[0-1][0-9]\.[1-2][0-9][0-9][0-9]">"\\server\name\pfad\pfad\pfad\Summe2.txt"  
usw...

Der erste Durchlauf auf Ordner1 funktioniert richtig, aber nach dem Durchsuchen des 2. Ordners, stimmt die Anzahl der Dateien nicht mehr (zu viele)...
Bei jedem weiteren Ordner natürlich auch nicht...
Member: lesclaypool
lesclaypool Aug 31, 2017 at 11:40:09 (UTC)
Goto Top
!tm:~3,8!
Das war nur ein Versuch, bzw. versehen...
Mitglied: 133883
Solution 133883 Aug 31, 2017 updated at 12:42:21 (UTC)
Goto Top
Der erste Durchlauf auf Ordner1 funktioniert richtig, aber nach dem Durchsuchen des 2. Ordners, stimmt die Anzahl der Dateien nicht mehr (zu viele)...
Vollkommen logisch face-smile weil hier Umgebungsvariablen verwendet werden und wenn du die zwischen den Durchläufen nicht löschst kommen die alten zusätzlich mit in die Neue Datei face-wink.

Da ich aber 6 Ordner habe, habe ich obigen code einfach hintereinander gesetz
Ja nee, das geht eleganter mit einer weiteren FOR /D Schleife über alle Unterordner eines Ordners.
@echo off
for /d %%f in ("\\server\name\pfad\pfad\pfad\*") do (  
  setlocal ENABLEDELAYEDEXPANSION
  for %%a in ("%%~f\*.pdf") do (  
      set "tm=%%~ta"  
      set /a "Datum:!tm:~3,7! += 1"  
  )
  > "\\server\name\pfad\pfad\pfad\Summe_%%~nxf.txt"  (set | findstr "^Datum:[0-1][0-9]\.[1-2][0-9][0-9][0-9]")  
  endlocal
)
Member: lesclaypool
lesclaypool Aug 31, 2017 at 12:34:13 (UTC)
Goto Top
Ok, verstehe die Richtung, aber so ganz hab ich es wohl noch nicht verstanden...
Wenn ich Dein Script so wie es ist, laufen lasse, funktioniert es auf den ersten Ordner, .txt wird erstellt und dann rattert nur noch "fehlender Operator" durch.
Mitglied: 133883
133883 Aug 31, 2017 updated at 12:48:39 (UTC)
Goto Top
Zitat von @lesclaypool:

Ok, verstehe die Richtung, aber so ganz hab ich es wohl noch nicht verstanden...
Dann geh in dich und schlage erst mal jede Zeile und Befehl nach vor allem set solltest du dir mal anschauen.
Wenn ich Dein Script so wie es ist, laufen lasse, funktioniert es auf den ersten Ordner, .txt wird erstellt und dann rattert nur noch "fehlender Operator" durch.
Hier getestet läuft einwandfrei durch, hast du wohl fehlerhaft angepasst/kopiert.
screenshot
Member: lesclaypool
lesclaypool Aug 31, 2017 at 13:10:04 (UTC)
Goto Top
Ok, vor lauter Aufregung habe ich übersehen, dass
setlocal ENABLEDELAYEDEXPANSION
erst nach der /d Schleife eingesetzt werden muß...
Ich bedanke mich nochmals für die super Hilfe !!