
37414
22.11.2007, aktualisiert am 18.10.2012 um 18:32:43 Uhr
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 74245
Url: https://administrator.de/forum/batchdatei-im-netzwerk-74245.html
Ausgedruckt am: 17.04.2025 um 11:04 Uhr
33 Kommentare
Neuester Kommentar
hallo imebro,
ens wurde zwar schon geantwortet aber ich saß schon dran und jetzt schick ich einfach mal meine Code:
Nur noch die Pfade müsse angeglichen werden.
lg vbmaxi
ens wurde zwar schon geantwortet aber ich saß schon dran und jetzt schick ich einfach mal meine Code:
@ECHO OFF
if exist \\p32\shared\update\update.exe goto main
if not exist \\p32\shared\update\update.exe goto ende
:main
replace \\p32\shared\update\update.exe c:\ /u
start c:\update.exe
goto good_ende
:fail_ende
echo Es ist kein neues Update vorhanden!
:good_ende
echo Update.exe wurde erfolgreich downgeloaded und ausgeführt
Nur noch die Pfade müsse angeglichen werden.
lg vbmaxi
ich saß schon dran und jetzt schick ich einfach mal meine Code:
... ich auch @echo off & setlocal
if not exist "\\dateiserver\daten\oh\updates\update.exe" echo Es liegt keine neue Version vor! & goto :eof
for /f %%i in ('xcopy /d /y "\\dateiserver\daten\oh\updates\update.exe" "c:\oh\"') do set "Neu=%%i"
if "%Neu%" neq "1" goto :eof
c:\oh\update.exe
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!
Grüße
bastla
Moin imebro,
nicht als Rüffel auffassen, sondern als ernstgemeinte Antwort:
Am CMD-Prompt:
und eventuell noch "Help FOR", obwohl Du zu diesem Konstrukt ...
...hier im Forum ziemlich viele einleuchtende Beispiele finden solltest.
Grüße
Biber
P.S. Ach ja, und mit " & " werden einfach nur zwei oder mehr Befehle in einer Zeile losgetreten.
Standard im Batch war/ist ja die "eine-Anweisung-pro-Zeile"-Mimik.
nicht als Rüffel auffassen, sondern als ernstgemeinte Antwort:
Am CMD-Prompt:
Help setlocal
Help goto
XCopy /?
Help If
FOR /F.....('irgendwas-mit-Textausgabe') do SET variable="Teil-der-Ausgabe"
Grüße
Biber
P.S. Ach ja, und mit " & " werden einfach nur zwei oder mehr Befehle in einer Zeile losgetreten.
Standard im Batch war/ist ja die "eine-Anweisung-pro-Zeile"-Mimik.
Hallo imebro!
wenn die Datei (da jünger) kopiert wurde, oder mit
wenn nicht kopiert wurde.
Aus dieser Zeile wird das erste Token ("1" oder "0") in die Variable %Neu% geschrieben. Das Ausführen der "update.exe" ist ja nur erforderlich, wenn es eine neue Version gibt (und diese auch kopiert wurde) - daher nur, wenn in der Variablen "1" steht.
Grüße
bastla
P.S.: Als Laien haben alle einmal angefangen ...
Vor allem beschäftigt mich dieser Eintrag "do set "Neu=%%i"" und die anschließende Zeile "if "%Neu%" neq "1" goto :eof".
Mittlerweile weiß ich ja dank Deiner Hilfe, dass "neq" --> "nicht gleich" bedeutet.... aber was ist nicht gleich "1" ???
Die Ausgabe von "xcopy" (geht analog auch mit "replace", wenn Du das offensichtlich bevorzugst) endet mit einer ZeileMittlerweile weiß ich ja dank Deiner Hilfe, dass "neq" --> "nicht gleich" bedeutet.... aber was ist nicht gleich "1" ???
1 Datei(en) kopiert
0 Datei(en) kopiert
Aus dieser Zeile wird das erste Token ("1" oder "0") in die Variable %Neu% geschrieben. Das Ausführen der "update.exe" ist ja nur erforderlich, wenn es eine neue Version gibt (und diese auch kopiert wurde) - daher nur, wenn in der Variablen "1" steht.
Des weiteren verstehe ich nicht, warum bastla "xcopy" verwendet und nicht das von mir angegebene "replace"? Wo liegt der Vorteil?
"xcopy" verwende ich öfter (und ist mir daher geläufig), "replace" nie - sollte Dich aber nicht von Letzterem abhalten.Grüße
bastla
P.S.: Als Laien haben alle einmal angefangen ...
Hallo imebro!
Anyhow - was meinst Du mit "reinkopiert" - doch nicht von Hand, oder? Eigentlich ist dafür der Batch zuständig, und wenn noch keine Datei vorhanden war, dann wurde "1 Datei(en) kopiert" und demzufolge sollte das Update auch gestartet worden sein. Bei Verwendung von "replace" hast Du natürlich das Problem, dass "/A" und "/U" nicht miteinander verwendet werden können und daher bei noch nicht vorhandener "update.exe" diese erst einmal kopiert werden muss - etwa so:
Die "xcopy"-Version würde dagegen so aussehen:
Die "pause" am Ende soll dafür sorgen, dass die Meldungen auch gelesen werden können - falls nicht erforderlich, einfach wieder statt "goto :Ende" ein "goto :eof" verwenden und alles ab ":Ende" weg lassen.
Grüße
bastla
habe die Batchdatei von bastla heute Morgen getestet.
Ist leider schwierig, da ich im Verzeichnis "C:\OH" des Test-Clients noch keine "update.exe" liegen hatte.
Nachdem ich diese reinkopiert habe, trägt sie natürlich das gleiche Erstellungs-Datum, wie die "update.exe" auf dem Server und wird somit nicht ersetzt.
--> Anscheinend bezieht sich die Angabe "d" (Datum) auf das Erstellungsdatum und nicht auf
das Änderungsdatum... denn sonst hätte es ja funktionieren müssen.
Ob Du da nicht "Erstellung" und "Änderung" verwechselst ...Ist leider schwierig, da ich im Verzeichnis "C:\OH" des Test-Clients noch keine "update.exe" liegen hatte.
Nachdem ich diese reinkopiert habe, trägt sie natürlich das gleiche Erstellungs-Datum, wie die "update.exe" auf dem Server und wird somit nicht ersetzt.
--> Anscheinend bezieht sich die Angabe "d" (Datum) auf das Erstellungsdatum und nicht auf
das Änderungsdatum... denn sonst hätte es ja funktionieren müssen.
Anyhow - was meinst Du mit "reinkopiert" - doch nicht von Hand, oder? Eigentlich ist dafür der Batch zuständig, und wenn noch keine Datei vorhanden war, dann wurde "1 Datei(en) kopiert" und demzufolge sollte das Update auch gestartet worden sein. Bei Verwendung von "replace" hast Du natürlich das Problem, dass "/A" und "/U" nicht miteinander verwendet werden können und daher bei noch nicht vorhandener "update.exe" diese erst einmal kopiert werden muss - etwa so:
@echo off & setlocal
echo Es wird nach einer neuen Version von MyOH gesucht!
echo.
if not exist "c:\oh\update.exe" copy "\\dateiserver\daten\oh\updates\update.exe" "c:\oh" & goto :Starten
for /f %%i in ('replace /u /h "\\dateiserver\daten\oh\updates\update.exe" "c:\oh"') do set "Neu=%%i"
if "%Neu%" neq "1" echo Keine neue Version vorhanden! & goto :Ende
:Starten
c:\oh\update.exe
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!
:Ende
echo.
echo.
pause
@echo off & setlocal
echo Es wird nach einer neuen Version von MyOH gesucht!
echo.
for /f %%i in ('xcopy /d /h /y "\\dateiserver\daten\oh\updates\update.exe" "c:\oh"') do set "Neu=%%i"
if "%Neu%" neq "1" echo Keine neue Version vorhanden! & goto :Ende
c:\oh\update.exe
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!
:Ende
echo.
echo.
pause
Des weiteren wüßte ich gerne, ob es eine Möglichkeit gibt, am Schluss die ausgeführte "update.exe" zu beenden. Dort erscheint nämlich nach dem Update ein Feld, welches man mit OK bestätigen muss. Wäre toll, wenn sich das automatisieren ließe.
Falls es nicht bereits einen passenden Parameter (zB "/silent") dafür gibt, solltest Du diesbezüglich den Hersteller kontaktieren.Achja.... ich habe oben "replace" anstatt "xcopy" gewählt, weil ich mir vorstellen könnte, dass ein ersetzen vielleicht etwas schneller geht, als kopieren... die "update.exe" ist immerhin etwas mehr als 20 MB groß.
... weil nämlich beim Ersetzen (im Unterschied zum Kopieren) mit der "update.exe" was passiert?Grüße
bastla
Hallo imebro!
Der Schalter "/silent" wird oft bei Installationsdateien angeboten, um diese (so wie Du es auch haben möchtest) ohne Benutzereingriff und ev auch ohne Bildschirmausgaben ablaufen zu lassen - in diesem Fall spricht man von "unbeaufsichtigter" (oder "unattended") Installation (http://de.wikipedia.org/wiki/Unbeaufsichtigte_Installation).
Ob Deine "update.exe" diese Möglichkeit bietet, könntest Du zwar durch einen Aufruf von der Kommandozeile (mit Angabe dieses Schalters oder mit "/?", um ev die Optionen angezeigt zu bekommen) herauszufinden versuchen - der Hersteller wird es aber auf jeden Fall wissen ...
Grüße
bastla
Der Schalter "/silent" wird oft bei Installationsdateien angeboten, um diese (so wie Du es auch haben möchtest) ohne Benutzereingriff und ev auch ohne Bildschirmausgaben ablaufen zu lassen - in diesem Fall spricht man von "unbeaufsichtigter" (oder "unattended") Installation (http://de.wikipedia.org/wiki/Unbeaufsichtigte_Installation).
Ob Deine "update.exe" diese Möglichkeit bietet, könntest Du zwar durch einen Aufruf von der Kommandozeile (mit Angabe dieses Schalters oder mit "/?", um ev die Optionen angezeigt zu bekommen) herauszufinden versuchen - der Hersteller wird es aber auf jeden Fall wissen ...
Grüße
bastla
Moin imebro,
Bitte mach daraus einen neuen Beitrag und diesen hier schließen wir ab.
Grüße
Biber
Bessere Chancen auf einen Hinweis wirst Du vermutlich in einem neuen Thread haben .
Da schließe ich mich bastla an.. wer sollte einen Thread "Batchdatei im Netzwerk" öffnen, weil er etwas über den "Active delivery wizard" zu sagen hat?Bitte mach daraus einen neuen Beitrag und diesen hier schließen wir ab.
Grüße
Biber
Hallo imebro!
Sollte dann etwa so aussehen (ungetestet):
Der Schalter "/u" sorgt bei "xcopy" dafür, dass nur kopiert wird, wenn eine gleichnamige Datei bereits im Zielordner existiert (eigentlich wie "replace"
), daher habe ich vorweg das "if exist" eingespart - bei Bedarf bitte ergänzen.
Wenn als Ziel für den Kopiervorgang der Ordner mit abschließendem "\" (siehe %AnInst%) angegeben wird, entfällt die Rückfrage
Grüße
bastla
[Edit] Fehlende Anführungszeichen und ~t ergänzt. [/Edit]
Sollte dann etwa so aussehen (ungetestet):
@echo off & setlocal
set "OHInst=C:\oh\oh.exe"
set "OHUpd=\\dateiserver\daten\oh\updates\update.exe"
set "AnInst=c:\programme\hassheider datasystems\antrag\"
set "AnUpd=\\dateiserver\daten\antrag\update\antraege.exe"
if not exist "%OHInst%" goto :Weiter
echo Es wird nach einer neuen Version von MyOH gesucht!
echo.
for %%i in ("%OHInst%") do for /f "tokens=1-5 delims=.: " %%a in ('echo %%~ti') do set DatInst=%%c%%b%%a%%d%%e
for %%i in ("%OHUpd%") do for /f "tokens=1-5 delims=.: " %%a in ('echo %%~ti') do set DatUpd=%%c%%b%%a%%d%%e
if "%DatUpd%" leq "%DatInst%" goto :Weiter
start /w "Update MyOH" "%OHUpd%"
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!
:Weiter
echo.
echo.
echo.
echo Es wird nach einer neuen Version des Antragsprogramms gesucht!
for /f %%i in ('xcopy /d /u /h /r /y "%AnUpd%" "%AnInst%"') do set "Neu=%%i"
if "%Neu%" neq "1" echo Keine neue Version vorhanden oder Antragsprogramm nicht installiert! & goto :eof
echo.
echo Kopiervorgang beendet - das Antrags-Programm wurde aktualisiert!
Wenn als Ziel für den Kopiervorgang der Ordner mit abschließendem "\" (siehe %AnInst%) angegeben wird, entfällt die Rückfrage
Ist das Ziel c:\programme\hassheider datasystems\antrag ein Dateiname
oder ein Verzeichnisname
(D = Datei, V = Verzeichnis)?
Grüße
bastla
[Edit] Fehlende Anführungszeichen und ~t ergänzt. [/Edit]
Hallo imebro!
Ausgewertet wird das Änderungsdatum (inkl Zeit mit Stunde und Minute; Du kannst zur Kontrolle die Variablen %DatInst% und %DatUpd% ausgeben lassen). Gestartet wird das Update nur, wenn %DatUpd% größer als (exakt: nicht kleiner-gleich) %DatInst% ist.
Das Problem dürfte die Uhrzeit sein, da voraussichtlich die "update.exe" eine spätere Zeit als die darin enthaltene "oh.exe" aufweist.
Du kannst die Uhrzeit aus dem Vergleich herausnehmen, indem Du jeweils am Ende der beiden "for"-Zeilen "%%d%%e" entfernst.
Grüße
bastla
Ausgewertet wird das Änderungsdatum (inkl Zeit mit Stunde und Minute; Du kannst zur Kontrolle die Variablen %DatInst% und %DatUpd% ausgeben lassen). Gestartet wird das Update nur, wenn %DatUpd% größer als (exakt: nicht kleiner-gleich) %DatInst% ist.
Das Problem dürfte die Uhrzeit sein, da voraussichtlich die "update.exe" eine spätere Zeit als die darin enthaltene "oh.exe" aufweist.
Du kannst die Uhrzeit aus dem Vergleich herausnehmen, indem Du jeweils am Ende der beiden "for"-Zeilen "%%d%%e" entfernst.
Grüße
bastla
Moin imebro,
Das kannst Du theoretisch lassen (stört nicht).
Da aber die Token #4 und #5 nicht genutzt werden, wäre es überflüssig und eigentlich ein Programmierfehler.
Zwar ohne Folgen, aber verwirrend - versteht in 3 Monaten keiner, der den Code nochmals liest.
Grüße
Biber
Bleibt das "tokens=1-5 delims=.: " dennoch unverändert oder muss ich auf 1-3 ändern?
Das kannst Du theoretisch lassen (stört nicht).
Da aber die Token #4 und #5 nicht genutzt werden, wäre es überflüssig und eigentlich ein Programmierfehler.
Zwar ohne Folgen, aber verwirrend - versteht in 3 Monaten keiner, der den Code nochmals liest.
Grüße
Biber
Hallo imebro!
... mit "ping /n 30 localhost>nul" sogar um annähernd 30 Sekunden
.
Grüße
bastla
Aber wie verzögere ich die Ausführung der Batch um etwa 30 Sek.
Die Antwort hast Du Dir mit der folgenden Frage eigentlich schon selbst gegeben:Kann man ggf. mit z.B. "ping /n 10 localhost >nul" direkt hinter "@echo off & setlocal" den Beginn der Batch etwas verzögern?
Oder gibt es sonst eine Möglichkeit, dass die Batch vielleicht erst so etwa 30 Sekunden nach der Benutzeranmeldung startet?
Gibt es auch (zB "sleep.exe" aus den Windows Server 2003 Resource Kit Tools), aber die "ping"-Variante sollte genügen.Grüße
bastla
Moin imebro,
Dieser Befehl würde z.B. insgesamt 8x den Ping aufrufen und dieser dann jeweils knapp 4sec Dönekens machen.
Aber dennoch - ganz kann ich nicht nachvollziehen, an welcher Stelle Du wem 30 Sekunden geben willst/musst...
Geht es Dir jetzt um eine reine Anzeigezeit vom Meldungen auf dem Bildschirm?
Wenn ja, wäre Ping-Krams nicht schön, denn da lässt sich ja die "Pause" nicht durch ein simples ENTER oder SPACE des Users beenden.
Grüße
Biber
[Edit]..schon wieder überholt worden... Moin bastla!
[/Edit]
Aber wie verzögere ich die Ausführung der Batch um etwa 30 Sek
Da gibt es abendfüllende Variationsmöglichkeiten schon allein mit der Ping.exe und dem FOR /L-Befehl:for /L %i in (829, 23, 996) do ping -n 4 localhost>nul
Dieser Befehl würde z.B. insgesamt 8x den Ping aufrufen und dieser dann jeweils knapp 4sec Dönekens machen.
Aber dennoch - ganz kann ich nicht nachvollziehen, an welcher Stelle Du wem 30 Sekunden geben willst/musst...
Geht es Dir jetzt um eine reine Anzeigezeit vom Meldungen auf dem Bildschirm?
Wenn ja, wäre Ping-Krams nicht schön, denn da lässt sich ja die "Pause" nicht durch ein simples ENTER oder SPACE des Users beenden.
Grüße
Biber
[Edit]..schon wieder überholt worden... Moin bastla!