Batchdatei im Netzwerk
Hallo an Alle Batch-Profis
seit 2 Tagen versuche ich schon, eine Batch-Datei zu erstellen, die mir eine wichtige Aufgabe abnehmen kann.
Leider findet sich im Archiv kein passender Hinweis.
Ich hoffe auf Eure Hilfe.
Es geht um ein Update, welches in unregelmäßigen Abständen auf allen Clients ausgeführt werden soll.
Die "Update.exe" lade ich dafür jeweils per FTP-Server von einem Dienstleister runter.
Die Batchdatei soll dann in den Autostart aller Clients kopiert werden und wird dann bei der Anmeldung
eines Benutzers gestartet (Eintrag in login.bat in Active-Directory am Server hat leider nicht funktioniert).
Die Datei soll folgendes ausführen:
1) Es soll nachgeschaut werden, ob sich auf dem Server-Verzeichnis "dateiserver\daten\oh\updates" eine Datei "update.exe" befindet.
2) Wenn ja, dann soll verglichen werden, ob diese ein neueres Datum hat, als die gleiche Datei auf dem eigenen Client
im Verzeichnis "C:\OH"
3) Ist das der Fall, soll die Datei vom Server auf den eigenen Client kopiert werden (also nach "C:\OH") und die dort
vorhandene "update.exe" (mit dem älteren Datum) soll überschrieben werden.
4) Als letztes soll die Datei "C:\OH\update.exe" nun ausgeführt werden.
--> Vielleicht wäre auch eine Schleife ratsam. Also wenn auf dem Server keine neuere "update.exe" liegt, soll die Batchdatei
beendet werden.
==================================================
Falls jemand sich über die Kompliziertheit wundert - hier eine kurze Erklärung:
Wenn ich die neue "update.exe" einfach so auf dem Server lasse und nicht auf den Client-PC runterlade, würde sie ja bei jeder Anmeldung eines Benutzers am PC wieder ausgeführt... also täglich.
Erst durch den Vergleich mit der gleichen Datei auf dem eigenen System funktioniert es so, dass das Update NICHT mehr ausgeführt wird, wenn das Datum das gleiche ist... und das wäre ja ab dem nächsten Tag der Fall.
Auch das löschen der "update.exe" vom Server-Verzeichnis am nächsten Tag wäre unsinnig, da es ja sein kann, dass ein
Mitarbeiter im Urlaub ist. Dann würde er das Update nicht mehr bekommen, da es ja vom Server gelöscht ist.
Mir scheint das hier daher die beste Möglichkeit zu sein, alle Eventualitäten abzudecken... es sei denn, jemand von Euch
hat eine clevere andere Idee
==================================================
Hier mein bisheriger Entwurf der Batch-Datei:
--------------------------------------------------------------
if exist \\dateiserver\daten\oh\updates\update.exe goto WEITER
ECHO Es liegt keine neue Version vor!
goto ENDE
:WEITER
for /f %%i in (\\dateiserver\daten\oh\updates\update.exe) do replace %%i c:\oh /u /r
copy \\dateiserver\daten\oh\updates\update.exe c:\oh
c:\oh\update.exe
ECHO Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!
:ENDE
==================================================
Vielen Dank & Gruss
Ingo
Antwort schreiben
Antwort 1 von batti-batch vom 24.11.2019, 19:23 Options
Hallo imebro,
Deine Idee habe ich aufgegriffen und einen Lösungsvorschlag für Dich erarbeitet.
Das Programm kannst Du jederzeit durch Änderungen im
SET-Block
an die aktuelle Situation anpassen:
SET "quell_datei=\\dateiserver\daten\oh\updates\update.exe"
SET "ziel_verzeichnis=c:\oh\"
SET "ziel_datei=update.exe"
SET "meldung=c:\test\meldung.txt"
Die
ERRORLEVEL
-Rückgabewerte sind im
REPLACE
-Befehl leider etwas spartanisch implementiert, deshalb musste ich den Standardausgabekanal
STDOUT
heranziehen, um die Meldungen des Programms eindeutig gestalten zu können.
Hier nun das komplette Programm:
@ECHO off
SETLOCAL enabledelayedexpansion
REM
REM Testprogramm
REM Pruefen, ob ein Update vorliegt
REM Aktualisieren einer zweiten Datei
REM
REM http://www.supportnet.de/threads/1639384
REM
REM (c) batti-batch
REM Erstellt am 24.11.2007
REM
REM Batch getestet unter Windows 2000
REM
SET "quell_datei=\\dateiserver\daten\oh\updates\update.exe"
SET "ziel_verzeichnis=c:\oh\"
SET "ziel_datei=update.exe"
SET "meldung=c:\test\meldung.txt"
CLS
REM Wenn die Quelldatei nicht exitstiert
REM Ende des Programms
IF NOT EXIST %quell_datei% (
ECHO Quelldatei existiert nicht.
GOTO :meldung
)
REM Ermitteln, ob die Zieldatei existiert
REM und die Option fuer REPLACE festlegen
IF NOT EXIST %ziel_verzeichnis%\%ziel_datei% (
SET option=/a
) ELSE (
SET option=/u
)
REPLACE %option% %quell_datei% %ziel_verzeichnis% 1>%meldung% 2>NUL
IF errorlevel 11 GOTO :syntax
IF errorlevel 8 GOTO :speicher
IF errorlevel 5 GOTO :zugriff
IF errorlevel 1 GOTO :unzulaessig
IF errorlevel 0 GOTO :erfolg
GOTO :ende
:syntax
ECHO Der Benutzer %username% hat eine
ECHO unzulaessige Syntax in der Befehlszeile verwendet.
GOTO :fehler
:speicher
ECHO Es ist nicht genuegend Arbeitsspeicher verfuegbar,
ECHO um den Befehl auszufuehren.
GOTO :fehler
:zugriff
ECHO Der Benutzer %username% hat keine Zugriffsberechtigung
ECHO auf die zu ersetzende Datei.
GOTO :fehler
:unzulaessig
ECHO Replace hat eine unzulaessige Version
ECHO von MS-DOS ermittelt.
GOTO :fehler
:erfolg
IF EXIST %meldung% (
FOR /f "tokens=2 delims= " %%i IN ('FINDSTR . "%meldung%"') DO (
SET wert=%%i
IF [!wert!] EQU [Dateien] ECHO Keine Aktualisierung notwendig.
IF [!wert!] EQU [von] (
ECHO Kopiervorgang beendet - das Programm MyOH wurde aktualisiert^^!
GOTO :meldung
)
)
)
:meldung
ECHO.
ECHO Der Programmablauf wurde ohne Fehler beendet.
GOTO :ende
:fehler
ECHO.
ECHO Der Programmablauf wurde mit einem Fehler beendet.
GOTO :ende
:ende
IF EXIST %meldung% DEL /f %meldung% 1>NUL 2>NUL
Viel Spaß beim Testen.
Herzliche Grüße
batti-batch
Antwort 2 von imebro vom 26.11.2019, 08:22 Options
Hallo batti-batch,
vielen Dank für die super ausführliche Antwort.
Zwar blicke ich nicht durch alles durch - aber es klingt recht professionell :-)
Aber nochmal ganz kurz ein paar abschließende Fragen:
1) ich kann die "update.exe" also ruhig immer auf dem Server belassen?
2) es wird nur upgedatet, wenn eine neue "update.exe" auf den Server kommt?
3) die "update.exe" auf dem Client (also bei jedem Mitarbeiter-PC auf c:\oh) wird nach dem ersetzen durch eine neue "update.exe" auch automatisch ausgeführt?
Vielen Dank nochmal und viele Grüße,
Ingo
Antwort 3 von batti-batch vom 26.11.2019, 08:39 Options
Hallo Ingo,
zu Deinen Fragen:
(1) die "update.exe" kannst Du auf dem Server belassen
(2) es erfolgt nur ein Update des Clients, wenn eine neuere Datei vorhanden ist.
(3) nein - in dieser Version des Programms passiert noch garnichts - damit Du das Programm in aller Ruhe testen kannst.
Wenn der Test gelaufen ist, kannst Du die Zeile
ECHO Kopiervorgang beendet - das Programm MyOH wurde aktualisiert^^!
ändern in:
ECHO Kopiervorgang beendet - das Programm MyOH wurde aktualisiert^^!
IF EXIST %meldung% DEL /f %meldung% 1>NUL 2>NUL
START /wait %ziel_verzeichnis%\%ziel_datei%&EXIT
Viel Spaß beim Testen.
Herzliche Grüße
batti-batch
Antwort 4 von imebro vom 26.11.2019, 12:44 Options
nochmal ich...
vielen Dank zunächst an batti-batch für den Code - funktioniert einwandfrei.
Ich wollte die "update.exe" unbeaufsichtigt ablaufen lassen, damit nicht jeder Mitarbeiter am Ende ein OK drücken muss.
Dazu hatte ich die Option "/silent" gefunden, die man in der Batchdatei mit angeben kann.
Das funktioniert jedoch nicht - sodass ich mich an den Hersteller der EXE-Datei gewendet habe.
Leider kann mir auch der Hersteller nicht weiterhelfen.
Eine andere Lösung, die EXE zu beenden, ohne dass die Mitarbeiter ein OK drücken müssen, kenne ich leider auch nicht.
Der Hersteller konnte mir nur sagen, dass es sich wohl um eine EXE-Datei handelt, die mit dem "Active delivery wizard" erstellt bzw. abgehandelt wird. Vielleicht hilft jemandem das ja weiter, um mir weitere Tips zu geben...
Danke & Gruss
Ingo