37414
Goto Top

Batchdatei im Netzwerk

Hallo an Alle Batch-Profis face-smile

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 face-wink


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

Content-Key: 74245

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

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

Member: schregi82
schregi82 Nov 22, 2007, updated at Oct 18, 2012 at 16:32:43 (UTC)
Goto Top
Member: vbMaxi
vbMaxi Nov 22, 2007 at 15:39:40 (UTC)
Goto Top
hallo imebro,
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
Member: bastla
bastla Nov 22, 2007 at 15:43:11 (UTC)
Goto Top
ich saß schon dran und jetzt schick ich einfach mal meine Code:
... ich auch face-wink:

@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
Member: vbMaxi
vbMaxi Nov 22, 2007 at 16:11:05 (UTC)
Goto Top
hallo Allezusammen,
[offtopic]Tja so kanns gehen face-wink[/offtopic]

lg vbmaxi
Mitglied: 37414
37414 Nov 22, 2007 at 16:23:52 (UTC)
Goto Top
Mein Gott seid Ihr schnell face-wink

Vielen Dank für Eure superschnelle Hilfe.

Zum Eintrag von bastla hab ich noch ein paar Fragen:
- was bedeutet das "& setlocal" ganz oben?
- warum z.B. auch vor "goto :eof" das &-Zeichen?
- kann ich das " 'xcopy /d /y " in Zeile 3 so übernehmen oder muss ich es anpassen?
- was passiert durch den Einsatz von "do set "Neu=%%i"" bzw. "...neq..."?

Sorry wegen der vielen Fragen... aber jetzt bin ich doch neugierig geworden face-smile

Danke nochmals.

Gruss
Ingo
Member: Biber
Biber Nov 22, 2007 at 16:33:47 (UTC)
Goto Top
Moin imebro,

nicht als Rüffel auffassen, sondern als ernstgemeinte Antwort:

Am CMD-Prompt:
Help setlocal
Help goto
XCopy /?
Help If
und eventuell noch "Help FOR", obwohl Du zu diesem Konstrukt ...
 FOR /F.....('irgendwas-mit-Textausgabe') do SET variable="Teil-der-Ausgabe"  
...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.
Mitglied: 37414
37414 Nov 22, 2007 at 16:54:39 (UTC)
Goto Top
Hallo Biber,

danke für den Hinweis... habe es auch nicht als Rüffel aufgefaßt.
An das CMD-Prompt denkt man einfach nie.

Habe mir das gerade angeschaut - aber mal ehrlich - wer blickt da wirklich durch???
Also als Batchprofi sicher ja... aber ich als Leihe absolut NO face-wink

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" ???

Des weiteren verstehe ich nicht, warum bastla "xcopy" verwendet und nicht das von mir
angegebene "replace"? Wo liegt der Vorteil?

Vielleicht hast Du ja doch mal Lust, ein paar Minütchen für ne Aufklärung zu investieren face-wink

Thanks
Ingo
Member: bastla
bastla Nov 22, 2007 at 17:09:56 (UTC)
Goto Top
Hallo imebro!

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 Zeile
1 Datei(en) kopiert
wenn die Datei (da jünger) kopiert wurde, oder mit
0 Datei(en) kopiert
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.

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 ...
Mitglied: 37414
37414 Nov 22, 2007 at 17:14:53 (UTC)
Goto Top
@ bastla

Vielen Dank für die wirklich gute und verständliche Erklärung.
Hab´s jetzt kapiert und werde Deinen Vorschlag mal so umsetzen... dann auch mit xcopy.

Bin gespannt!

Schönen Abend noch,
Ingo
Mitglied: 37414
37414 Nov 23, 2007 at 08:17:26 (UTC)
Goto Top
Hallo an Alle,

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.

Aber es müßte eh noch etwas verändert werden:
Es wird nämlich IMMER eine "update.exe" auf dem Server liegen. Daher kann die Abfrage
"if exist..." oder "if not exist..." entfallen.

Im Grunde muss die Abfrage der Batchdatei (die ja auf jedem Client liegt) wie folgt lauten:

- gebe die Meldung aus "Es wird nach einer neuen Version von MyOH gesucht!"

- schaue nach, ob die "update.exe" auf "\\dateiserver\daten\oh\updates" neuer/aktueller ist,
als die in meinem eigenen Verzeichnis "c:\oh"

- wenn JA, dann ersetze (replace) diese, führe sie anschließend aus und gebe die Meldung
aus "Das Programm MyOH wurde aktualisiert!"

- wenn NEIN, dann gehe zu EOF und gebe die Meldung aus "keine neue Version vorhanden!"

Bin nur nicht sicher, wie ich da die Angaben von bastla mit...

do set "Neu=%%i"
if "%Neu%" neq "1"

...einsetze.
Deshalb hier nochmals meine Anfrage.

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.

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ß.

Vielen Dank & schöne Grüsse,
Ingo
Member: bastla
bastla Nov 23, 2007 at 11:13:34 (UTC)
Goto Top
Hallo imebro!

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 ...

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
Die "xcopy"-Version würde dagegen so aussehen:
@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
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.

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
Mitglied: 37414
37414 Nov 23, 2007 at 11:34:12 (UTC)
Goto Top
@ bastla

Vielen Dank für die - wieder mal - gute Erklärung.

Werde die Batch mit xcopy nun nehmen...

Wahrscheinlich ist wohl ersetzen und kopieren im Endeffekt das gleiche.....?....! face-smile

Aber noch eine Frage zur Angabe "/silent".
Was genau ist damit gemeint? Kann ich diese Angabe innerhalb meiner Batch verwenden?

Vielen Dank nochmals.
Ingo
Member: bastla
bastla Nov 23, 2007 at 13:21:16 (UTC)
Goto Top
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
Mitglied: 37414
37414 Nov 26, 2007 at 11:40:24 (UTC)
Goto Top
Hallo Alle,
hallo bastla

vielen Dank zunächst an bastla für den Code - funktioniert einwandfrei.

In Sachen "/silent" kann mir leider 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
Member: bastla
bastla Nov 26, 2007 at 11:54:28 (UTC)
Goto Top
Hallo imebro!

... mit dem "Active delivery wizard" erstellt ...
Vielleicht hilft jemandem das ja weiter, um mir weitere Tips zu geben...
Ich muss da leider passen. face-sad

Bessere Chancen auf einen Hinweis wirst Du vermutlich in einem neuen Thread haben ...

Grüße
bastla
Member: Biber
Biber Nov 26, 2007 at 14:59:07 (UTC)
Goto Top
Moin imebro,

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
Mitglied: 37414
37414 Nov 27, 2007 at 09:03:38 (UTC)
Goto Top
Hallo an Alle
hallo bastla + biber

Habe einen neuen Thread geöffnet und auch schon Antworten erhalten...

Zum hier vorliegenden Thread habe ich aber noch eine Frage.
Nachdem alles wunderbar klappt, habe ich die Batchdatei nun auch für ein zweites Programm (antraege.exe) angelegt, welches nun auch automatisch aktualisiert wird.

In diesem Fall muss jedoch keine Datei ausgeführt werden, sondern lediglich in ein bestimmtes Verzeichnis kopiert werden, wenn eine neue Version vorliegt.

Nun würde ich beide Batch-Dateien gerne zusammenführen - scheitere aber an der FOR-Abfrage, da ich nicht weiß, wie man die verbinden kann.

Hier mal beide Batchdateien:

1) Wenn aktuellere Datei auf Server vorliegt -> diese auf den Client kopieren und ausführen!

@echo off & setlocal

echo Es wird nach einer neuen Version von MyOH gesucht!

echo.

for /f %%i in ('xcopy /d /h /r /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 /silent

echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!

:ENDE


2) Wenn aktuellere Datei auf Server vorliegt -> diese auf den Client kopieren!

@echo off & setlocal

echo Es wird nach einer neuen Version des Antragsprogramms gesucht!

echo.

for /f %%i in ('xcopy /d /h /r /y "\\dateiserver\daten\antrag\update\antraege.exe"
"c:\programme\hassheider datasystems\antrag"') do set "Neu=%%i"

if "%Neu%" neq "1" echo Keine neue Version vorhanden! & goto :ENDE

echo Kopiervorgang beendet - das Antrags-Programm wurde aktualisiert!

:ENDE


Im Moment ist das so, dass verschiedene Client-PCs die Version 1 nutzen und weitere die Version 2. Es gibt jedoch einige Client-PCs, die BEIDE Versionen benötigen.

Um zu vermeiden, dass in der Version 1 die "update.exe" zuerst auf den Client runtergeladen werden muss, habe ich mir überlegt, einfach diese mit der "oh.exe" auf dem Client zu vergleichen... falls das geht, wenn es Dateien mit unterschiedlichen Namen sind...?

Daher müßte die Abfrage etwa so aussehen:

a) wenn auf meinem PC (also dem Client) im Verzeichnis "c:\oh" eine Datei mit dem Namen "oh.exe" existiert UND gleichzeitig die Datei "update.exe" auf dem Serververzeichnis "\\dateiserver\daten\oh\updates\" aktueller ist, als diese --> dann führe die Datei "\\dateiserver\daten\oh\updates\update.exe" auf dem Server aus (diese aktualisiert das Verzeichnis "c:\oh" auf dem Client).

b) wenn auf meinem PC (also dem Client) im Verzeichnis "c:\programme\hassheider datasystems\antrag" eine Datei mit dem Namen "antraege.exe" existiert UND gleichzeitig die Datei "antraege.exe" auf dem Serververzeichnis "\\dateiserver\daten\antrag\update\" aktueller ist, als diese --> dann kopiere sie vom Server auf den Client nach "c:\programme\hassheider datasystems\antrag"!

Es muss also so sein, dass "a" und "b" hintereinander abgearbeitet werden, da ja ggf. auch beide Programme auf einem Client-PC bestehen können.
Wahrscheinlich muss erst nach "b" ein "goto ENDE" stehen... vermute ich mal face-wink

Hoffentlich hab ich mich verständlich ausgedrückt - ansonsten einfach nochmal posten.

Vielen Dank nochmals & Gruss,
Ingo
Member: bastla
bastla Nov 28, 2007 at 00:14:48 (UTC)
Goto Top
Hallo imebro!

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!
Der Schalter "/u" sorgt bei "xcopy" dafür, dass nur kopiert wird, wenn eine gleichnamige Datei bereits im Zielordner existiert (eigentlich wie "replace" face-wink), 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
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]
Mitglied: 37414
37414 Nov 28, 2007 at 10:14:08 (UTC)
Goto Top
@ bastla

Vielen Dank wieder mal!
Werde die Batch gleich mal an einem Testrechner ausprobieren.

LG
Ingo
Mitglied: 37414
37414 Nov 28, 2007 at 10:59:25 (UTC)
Goto Top
@ bastla

Habe eben getestet.
Im Grunde funktioniert das Programm...

Allerdings nicht im ersten Teil.
Ich habe eben eine ältere "oh.exe" ins Verzeichnis "c:\oh" kopiert, aber es erscheint dennoch die Meldung "keine neue Version vorhanden!" (diese Meldung hatte ich noch zusätzlich bei "if %DatUpd% leq %DatInst% goto :Weiter" vor dem "goto-Befehl" eingetragen).

Kannst Du bitte nochmal prüfen, woran das liegen könnte?

Danke & Gruss
Ingo
Member: bastla
bastla Nov 28, 2007 at 15:51:23 (UTC)
Goto Top
Hallo imebro!

Kannst Du bitte nochmal prüfen, woran das liegen könnte?
Ursache gefunden: Nichtbeachtung der Regel "Don't sleep and post!" face-sad

Die Korrektur des obigen Codes habe ich bereits vorgenommen.

Grüße
bastla
Mitglied: 37414
37414 Nov 28, 2007 at 18:44:40 (UTC)
Goto Top
@ bastla

...und nochmal danke! face-smile

heißt das, dass Du Deine Antwort von heute 1:14 Uhr nochmal verändert / angepaßt hast?
Kann leider im Moment nicht vergleichen, da ich jetzt zu Hause bin und nicht am Arbeitsplatz.

Gruss
Ingo
Member: bastla
bastla Nov 28, 2007 at 18:47:49 (UTC)
Goto Top
Hallo imebro!

heißt das, dass Du Deine Antwort von heute 1:14 Uhr nochmal verändert / angepaßt hast?
Ja, schien mir am sinnvollsten so.

Grüße
bastla
Mitglied: 37414
37414 Nov 29, 2007 at 10:17:55 (UTC)
Goto Top
@ bastla

sorry... schon wieder ich face-smile

Habe mich eben an einem Rechner angemeldet und dadurch ja die "update.exe" ausgeführt und alles aktualisiert.

Dann habe ich mich testweise erneut angemeldet und festgestellt, dass das Update nochmals ausgeführt wird... das passiert jetzt bei jeder Anmeldung (??)

Jetzt - also nach dem Update - sind die Eigenschaften der "oh.exe" auf Laufwerk "C" wie folgt:

- Erstellt = 15.11.07
- Geändert = 15.11.07
- Letzer Zugriff = 29.11.07

Die Eigenschaften der "update.exe" auf dem Server sind wie folgt:

- Erstellt = 26.11.07
- Geändert = 15.11.07
- Letzer Zugriff = 29.11.07

Kann es sein, dass die Batch auf das Erstellungsdatum der beiden Dateien zugreift?
Das würde erklären, warum die Aktualisierung immer wieder neu ausgeführt wird, da die "update.exe" ja in dem Fall immer neuer ist, als die "oh.exe" auf Laufwerk "c".

Kann man das ggf. auf das Änderungsdatum beziehen?

Das Erstellungsdatum der "update.exe" auf dem Server ändert sich wohl, wenn ich dieses über FTP auf unseren Server runterlade - das läßt sich also nicht verhindern. Merkwürdiger Weise bleibt aber das Erstellungsdatum der erzeugten Datei "oh.exe" das gleiche, wie das Änderungsdatum...

Hast Du da noch einen Tipp?

Vielen Dank und Gruss
Ingo
Member: bastla
bastla Nov 29, 2007 at 11:10:38 (UTC)
Goto Top
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
Mitglied: 37414
37414 Nov 29, 2007 at 12:20:19 (UTC)
Goto Top
Hallo bastla,

vielen Dank!
Habe eben an einem Client getestet und funktioniert jetzt einwandfrei.

Aber noch eine (hoffentlich letzte) Frage:
Bleibt das "tokens=1-5 delims=.: " dennoch unverändert oder muss ich auf 1-3 ändern?

Gruss
Ingo
Member: Biber
Biber Nov 29, 2007 at 14:11:05 (UTC)
Goto Top
Moin imebro,

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
Mitglied: 37414
37414 Nov 30, 2007 at 13:28:08 (UTC)
Goto Top
Hallo bastla,
hallo biber,

vielen Dank für Eure Hilfe!

Heute gab es ein neues Update und bei fast allen PCs hat die Batch gut funtkioniert.

Allerdings gab es bei 2 PCs ein kleines Problemchen...

Dort werden wohl zusätzliche Programme gestartet und daher wird die Batch wohl abgewürgt... jedenfalls tat sich gar nichts...

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?

Da einige KollegInnen fragten, was da wohl passiert und ich nun die Ausgabe der Batch auf´s Nötigste beschränken möchte, habe ich nun einige Meldungen in der Batch deaktiviert... das funktioniert aber nicht so recht:

Wenn KEINE neuen Updates da sind, sollte nur folgendes im CMD-Fenster erscheinen:

* SUCHE NACH UPDATES *

* KEIN UPDATE "XXXXX" VORHANDEN *

Wenn ich diese Meldungen so in die Batch eintrage (inkl. der Sternchen) und die restlichen Meldungen deaktiviere oder lösche, sieht man zwar die obere Meldung eine ganze Zeit lang (weil ja dahinter erst das "ping /n 10 localhost >nul" steht)... aber anschließend schließt sich das CMD-Fenster einfach.

- Was mache ich falsch?
- Darf man viell. keine Sternchen eingeben?
- Oder nicht nur Großbuchstaben nutzen?
- Muss ich noch mehrere z.B. "ping /n 5 localhost >nul" irgendwo einsetzen?

Eine "pause" will ich nicht einbauen, da die Mitarbeiter das bestätigen nerven würde face-smile

Hier mal die von mir abgeänderte Batch:


@echo off & setlocal

echo * SUCHE NACH UPDATES *

ping /n 10 localhost >nul

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

REM echo Es wird nach einer neuen Version von MyOH gesucht!
echo.

for %%i in ("%OHInst%") do for /f "tokens=1-3 delims=.: " %%a in ('echo %%~ti') do set DatInst=%%c%%b%%a
for %%i in ("%OHUpd%") do for /f "tokens=1-3 delims=.: " %%a in ('echo %%~ti') do set DatUpd=%%c%%b%%a

if "%DatUpd%" leq "%DatInst%" echo * KEIN UPDATE MyOH VORHANDEN * & goto :Weiter
start /w "Update MyOH" "%OHUpd%"

REM echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!

:Weiter
echo.
echo.
echo.

REM 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 * KEIN UPDATE ANTRAGSPROGRAMM VORHANDEN * & goto :ENDE
echo.

echo * ALLE PROGRAMME WURDEN AKTUALISIERT *

:ENDE

ping /n 5 localhost >nul


Bei der Darstellung wird nur 1 Sternchen angezeigt - ich hatte jedoch vor und hinter der Meldung je 5 Sternchen in der Batch eingegeben!

Wieder mal viele Grüße und ein schönes Wochenende,
Ingo
Member: Biber
Biber Nov 30, 2007 at 13:34:05 (UTC)
Goto Top
Moin imebro,

Streiche:
if "%DatUpd%" leq "%DatInst%" * KEIN UPDATE MyOH VORHANDEN *

Setze:
if "%DatUpd%" leq "%DatInst%" (Echo * KEIN UPDATE MyOH VORHANDEN *) & goto :weiter

Grüße
Biber
Mitglied: 37414
37414 Nov 30, 2007 at 14:19:07 (UTC)
Goto Top
@ biber

ja, hab ich gemacht und die beiden "kein update vorhanden"-Meldungen erscheinen jetzt auch mit den 5 Sternchen.

Aber wie verzögere ich die Ausführung der Batch um etwa 30 Sek., damit vorher am Client alle kleinen Programme starten können?

LG
Ingo
Member: bastla
bastla Nov 30, 2007 at 14:42:18 (UTC)
Goto Top
Hallo imebro!

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?
... mit "ping /n 30 localhost>nul" sogar um annähernd 30 Sekunden face-wink.
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
Member: Biber
Biber Nov 30, 2007 at 14:47:52 (UTC)
Goto Top
Moin imebro,

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! face-wink [/Edit]
Mitglied: 37414
37414 Dec 03, 2007 at 08:13:41 (UTC)
Goto Top
Hallo biber + bastla,

danke für Eure weitere Hilfe.

Beim Test der Batch auf einigen PC´s habe ich festgestellt, dass in einem Fall das DOS-Fenster sofort "abgewürgt" und geschlossen wurde, nachdem der User sich angemeldet hatte... da wurde z.B. zuerst ein automatischer Cleaner gestartet (BeClean) und wahrscheinlich wurde deshalb die Ausführung meiner Batchdatei beendet.

Wenn nun die Batch erst etwa 30 Sekunden nach der User-Anmeldung starten würde und man auch erst dann das DOS-Fenster sehen würde, dann könnte man verhindern, dass auch auf anderen PC´s meine Batch evtl. verhindert od. unterbrochen wird.

Danke & Gruss
Ingo