Batch Unterstützung - Vergleich und Kopie neuester Datei

virodri

Newbie
Registriert
Feb. 2020
Beiträge
5
Hallo zusammen,

es tut mir leid aber ich musste mich extra hier anmelden um mit meinem Problem weiterzukommen. Habe wenig Programmierkenntnisse aber bin schon tagelang im Netz unterwegs um es mir halbwegs selbst beizubringen um einen Batch für meine Bedürfnisse zu schreiben. Jetzt komme ich aber einfach nicht mehr weiter. Ich hoffe es kann mir jemand helfen.

Ausgangssituation:
In meiner Firma läuft an mehreren Info-Bildschirmen eine PowerPoint-Folie in Dauerschleife. Die Info-Bildschirme sind jeweils an eigenen separaten Computern angeschlossen, die Zugriff zu Netzlaufwerken haben. Sobald sich neue Firmen-Nachrichten ergeben werden diese in der laufenden PowerPoint integriert und mit neuem Namen (aktuelles Datum) auf einem Netzwerkordner abgespeichert. Auf den Info-Bildschirmen wird dann manuell per bereits bestehendem Batch die neueste PowerPoint Datei aus dem Netzwerkordner auf dem jeweiligen Desktop kopiert und auch per Batch gestartet.

gewünschte zukünftige Batch-Funktionalität:
  • Batch wird/soll dann zukünftig per Aufgabenplanung in regelmäßigen Abständen prüfen bzw. ausführen
  • Batch soll prüfen ob die neueste PPSX-Datei im Netzwerkordner der aktuellen PPSX-Datei auf dem Desktop entspricht
    • Wenn ja -> dann soll nichts passieren
    • Wenn nein ->
      • dann laufende PPSX-Datei stoppen und vom Desktop löschen
      • neueste Datei aus Netzwerkordner auf den Desktop kopieren
      • kopierte PPSX-Datei starten

Den Part Datei auf dem Desktop löschen, neueste Datei aus Netzwerkordner kopieren und starten habe ich bereits selbst hinbekommen (siehe Code unten)
Aber jetzt fehlt mir der Part der die neuste Datei mit der auf dem Desktop vergleicht und erst bei Ungleichheit die weiteren gewünschten Schritte ausführt.

Hier der bereits bestehende Batch-code:
@Echo off &setlocal
del C:\Users\PID364D\Desktop\*.ppsx /s /q
pushd "Hier steht normalerweise der Pfad des Netzwerkordners" ||goto :eof
for /f "delims=" %%a in ('dir /a-d /b /od *.ppsx') do set "newestFile=%%a"
copy "%newestFile%" "C:\Users\PID364D\Desktop\%newestFile%"
popd
set Neueste=
set Pfad="C:\Program Files (x86)\Microsoft Office\Office16\POWERPNT.EXE"
for /f "delims=" %%i in ('dir /b /od /a-d "C:\Users\PID364D\Desktop\*.ppsx" 2^>nul') do set "Neueste=%%i"
%Pfad% /s "C:\Users\PID364D\Desktop\%Neueste%"

Ich hoffe es kann mir jemand weiterhelfen. Ich wäre euch sehr dankbar und vielleicht kann ich noch was lernen.
Vielen Dank im Voraus.
 
Wenn du die Aufgabe über die Aufgabenplanung ausführst, dann drauf achten, daß die Aufgabe im Benutzerkontext stattfinden muss, der Zugriff auf C:\Users\PID364D\Desktop\ hat.

Ohne diese besondere Einstellung laufen die Aufgaben im Kontext vom System und hat so möglicherweise keinen Zugriff auf das Profileverzeichnis C:\Users\PID364D
 
Hallo,

Code:
@echo off
for /f "tokens=*" %%a in ('certutil -hashfile %PATH_TO_FILE_ON_NETWORKDRIVE% MD5 ^| findstr -vrc:"[^0123-9aAb-Cd-EfF ]"') do set HASH1=%%a
for /f "tokens=*" %%a in ('certutil -hashfile %PATH_TO_LOCAL_FILE% MD5 ^| findstr -vrc:"[^0123-9aAb-Cd-EfF ]"') do set HASH2=%%a

if "%HASH1%" == "%HASH2%" (
    echo "We already have the newest file"
) else (
    echo "We need to copy the file"
)

Gruß
 
Zuletzt bearbeitet:
robocopy.exe /MIR macht doch schon zu 90% was du willst. Wozu die Aufwand? Oder habe ich dein Problem missverstanden?
 
  • Gefällt mir
Reaktionen: Raijin
Wenn ich ihn richtig verstehe, haben die Dateien das Datum/Uhrzeit im Dateinamen. Wenn das so stimmt, dann müsste man also nur die neueste Datei auf dem Netzlaufwerk bestimmen und überprüfen ob der Dateiname mit der lokal genutzten Kopie übereinstimmt. Wenn er nicht übereinstimmt, dann wird die Datei kopiert und Powerpoint mit dieser Datei neu gestartet.

Das funktioniert natürlich nicht, wenn nur das Datum und nicht die Uhrzeit im Dateinamen enthalten ist, dann müsste man wirklich die Dateien vergleichen, womit auch immer.

Code:
@Echo off &setlocal

REM der Computername wird zum Killen von Powerpoint mittels WMI benötigt
REM man muss Powerpoint ja nur neu starten, wenn es einen Grund dafür gibt,
REM ansonsten geht das natürlich auch mittels Aufgabenplanung
set localComputername=Hier steht der lokale Computername

pushd "Hier steht normalerweise der Pfad des Netzwerkordners" ||goto :eof

REM Namen der neuesten Datei auf dem Server bestimmen
for /f "delims=" %%a in ('dir /a-d /b /o-d *.ppsx') do (
  set newestFilename=%%~na
  goto getlocalFile
)

:getlocalFile
REM Namen der lokalen Datei bestimmen (ich gehe davon aus,
REM dass es die einzige ppsx-Datei in dem Verzeichnis ist)
for /f "delims=" %%a in ('dir /a-d /b C:\Users\PID364D\Desktop\*.ppsx') do (
  set localFilename=%%~na
)

REM Namen der Dateien vergleichen
IF "%newestFilename%"=="%localFilename%" (
  echo Keine neue Datei gefunden.
  popd
  goto :eof
) else (
  REM neue Datei gefunden, also Powerpoint killen und alte Datei loeschen
  wmic /node:%localComputername% process where name="POWERPNT.EXE" delete
  del "C:\Users\PID364D\Desktop\%localFilename%"
  copy "%newestFilename%" "C:\Users\PID364D\Desktop\%newestFilename%"
  popd

  REM Powerpoint mit neuer Datei starten
  "C:\Program Files (x86)\Microsoft Office\Office16\POWERPNT.EXE" "C:\Users\PID364D\Desktop\%newestFilename%"
)
Eventuell muss man zwischen dem Killen von Powerpoint und dem Löschen der alten Datei noch eine Pause (timeout) einfügen, da man vermutlich die Datei erst löschen kann, wenn die Powerpoint-Instanz wirklich weg ist.
 
Fc vergleicht, mit /b binär. Allerdings gibt es standardmäßig Ausgaben. Errorlevel ist 0 für Identität.

Allerdings... man möge es mir verzeihen, aber die Chose ist unnötig komplex. Wenn Gelegenheit besteht, mit wem zusammensetzen und neu planen. Eine simple HTML Datei, die alle X Zeiteinheiten ein Bild aus einer Freigabe auswählt und neue Dateien berücksichtigen kann wäre weitaus flexibler und signifikant wartungsärmer. Es gibt sicher auch andere, individuell passendere Ansätze.
 
Hallo zusammen,

sorry, dass ich mich so spät erst melde.
Vielen Dank an alle Beteiligten für die Hilfe und die Ansätze

@easy.2ci
Vielen Dank für den Hinweis. Sobald ich den Batch zum Laufen bekomme werde ich mich dann mit der Aufgabenplanungsthematik auseinander setzen

@Langi
Danke für den Ansatz aber ich konnte mich dann besser in Andreas_ seine Lösung reindenken

@RalphS
Du hast natürlich recht, dass es mit Sicherheit elegantere Lösungen dazu gibt. Da ich aber auch keine Ahnung von HTML habe müsste ich mich auch zu dem Thema erst einarbeiten. Ich behalte es mal im Hinterkopf und werde es bei Gelegenheit mal versuchen anzugehen.

@Andreas_
Vielen lieben Dank für die komplette Lösung nur leider funktioniert etwas noch nicht so richtig.
Es ist aber sicherlich nur eine Kleinigkeit aber ich habe jetzt schon eine Weile versucht es selbst zum Laufen zu bringen aber ich bekomme es einfach nicht hin.

Der Vergleich der beiden Dateien funktioniert schon mal wunderbar.

Sobald aber die Datei auf dem Desktop gelöscht werden soll, wird diese nicht gefunden, da zwar nach dem richtigen Dateinamen gesucht wird aber ohne die Endung .ppsx.
Weiter geht es, dass die zu kopierende Datei nicht gefunden wird, weil auch da nur der Dateiname ohne Endung gesucht wird.
Und auch beim Starten der neuen Powerpoint wird diese nicht gefunden weil der Dateiname ohne Endung gesucht wird.

Weißt du bzw. jemand anderes Abhilfe? Warum wird die Endung der Datei nicht berücksichtigt?
 
virodri schrieb:
Sobald aber die Datei auf dem Desktop gelöscht werden soll, wird diese nicht gefunden, da zwar nach dem richtigen Dateinamen gesucht wird aber ohne die Endung .ppsx.
Weiter geht es, dass die zu kopierende Datei nicht gefunden wird, weil auch da nur der Dateiname ohne Endung gesucht wird.
Und auch beim Starten der neuen Powerpoint wird diese nicht gefunden weil der Dateiname ohne Endung gesucht wird.
Mir ist da ein kleiner Fehler unterlaufen. ~n ist der Dateiname ohne Erweiterung, für die Erweiterung benötigt es zusätzlich ein "x". Also ~n gegen ~nx austauschen (Zeilen 12 und 20 in meinem Beispiel).
 
@Andreas_
nochmals vielen lieben Dank für die Unterstützung. Ich weiß es wirklich zu schätzen.

Das mit der Dateiendung funktioniert jetzt prima aber es hat sich ein neues Problem aufgetan, dass ich mir nicht erklären kann bzw. sich mit meinem eingangs erwähnten Batch nicht so verhält:

Da es sich um eine Powerpoint mit der Endung .ppsx handelt müsste diese sofort im Präsentationsmodus starten aber in deinem Batch wird diese PPSX-Datei normal in Powerpoint im Bearbeitungsmodus aufgerufen.

Hast du da evtl. noch einen Einfall woran es liegen könnte, dass die Datei nicht wie es die Dateiendung vorgibt im Präsentationsmodus aufgerufen wird?

Ich danke vielmals im Voraus.
 
Du hattest doch in Deinem Eingangspost "/s" als Parameter. Schon mit dem versucht? Ich nutze weder privat noch beruflich Powerpoint ...

Code:
"C:\Program Files (x86)\Microsoft Office\Office16\POWERPNT.EXE" /s "C:\Users\PID364D\Desktop\%newestFilename%"
 
@Andreas_
Das war tatsächlich die Lösung. Die Powerpoint startet jetzt direkt im Präsentationsmodus. TOP!

😩Jetzt gibt es aber nochmal ein bzw. zwei Probleme:
  1. Das Kommandofenster bleibt geöffnet und wartet bis die laufende Powerpoint beendet wird. Ist wahrscheinlich ein kleines Problem aber es sollte sich nach starten der Präsentation schon schließen damit der Batch ja per Aufgabe regelmäßig angestoßen und die Dateien neu vergleichen kann.
  2. Wenn ich während der laufenden "neuesten" Präsentation den Batch manuell anstoße, dann erkennt der Batch nicht, dass es sich bereits um die neuste Datei handelt sondern kopiert einfach dieselbe Datei erneut. So als würde die Datei während der Präsentation einen anderen internen temporären Namen erhalten würde. Meinst du das könnte man auch irgendwie abfangen? Hast du eine Idee?
 
Perfekt, Problem 1 gelöst. Danke.

Jetzt bleibt nur noch Problem 2 übrig:
Wird der Batch während laufender aktueller Präsentation gestartet so kommt im Kommandofenster die Meldung, dass C:\Users\PID364D\Desktop\~$Dateiname.ppsx nicht gefunden wurde.
Eventuell die vorangestellten Sonderzeichen ~$ ein Hinweis darauf woran es liegen könnte bzw. wie man es umgehen könnte?
 
Ich habe keine Ahnung, was Powerpoint während einer Präsentation mit der Datei anstellt. Schaue doch einfach mit einem Dateimanager nach, während die Präsentation läuft.
 
Zurück
Oben