Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batchdatei im Netzwerk

Frage Entwicklung Batch & Shell

Mitglied: imebro

imebro (Level 2) - Jetzt verbinden

22.11.2007, aktualisiert 18.10.2012, 6980 Aufrufe, 33 Kommentare

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
33 Antworten
Mitglied: vbMaxi
22.11.2007 um 16:39 Uhr
hallo imebro,
ens wurde zwar schon geantwortet aber ich saß schon dran und jetzt schick ich einfach mal meine Code:

01.
@ECHO OFF 
02.
 
03.
if exist \\p32\shared\update\update.exe goto main 
04.
if not exist \\p32\shared\update\update.exe goto ende 
05.
 
06.
:main 
07.
 
08.
replace \\p32\shared\update\update.exe c:\ /u 
09.
start c:\update.exe 
10.
goto good_ende 
11.
 
12.
 
13.
 
14.
:fail_ende 
15.
echo Es ist kein neues Update vorhanden! 
16.
 
17.
:good_ende 
18.
echo Update.exe wurde erfolgreich downgeloaded und ausgeführt
Nur noch die Pfade müsse angeglichen werden.

lg vbmaxi
Bitte warten ..
Mitglied: bastla
22.11.2007 um 16:43 Uhr
ich saß schon dran und jetzt schick ich einfach mal meine Code:
... ich auch :

01.
@echo off & setlocal 
02.
if not exist "\\dateiserver\daten\oh\updates\update.exe" echo Es liegt keine neue Version vor! & goto :eof 
03.
for /f %%i in ('xcopy /d /y "\\dateiserver\daten\oh\updates\update.exe" "c:\oh\"') do set "Neu=%%i" 
04.
if "%Neu%" neq "1" goto :eof 
05.
c:\oh\update.exe 
06.
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert!
Grüße
bastla
Bitte warten ..
Mitglied: vbMaxi
22.11.2007 um 17:11 Uhr
hallo Allezusammen,
[offtopic]Tja so kanns gehen [/offtopic]

lg vbmaxi
Bitte warten ..
Mitglied: imebro
22.11.2007 um 17:23 Uhr
Mein Gott seid Ihr schnell

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

Danke nochmals.

Gruss
Ingo
Bitte warten ..
Mitglied: Biber
22.11.2007 um 17:33 Uhr
Moin imebro,

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

Am CMD-Prompt:
01.
Help setlocal 
02.
Help goto 
03.
XCopy /? 
04.
Help If
....und eventuell noch "Help FOR", obwohl Du zu diesem Konstrukt ...
01.
 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.
Bitte warten ..
Mitglied: imebro
22.11.2007 um 17:54 Uhr
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

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

Thanks
Ingo
Bitte warten ..
Mitglied: bastla
22.11.2007 um 18:09 Uhr
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
01.
1 Datei(en) kopiert
wenn die Datei (da jünger) kopiert wurde, oder mit
01.
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 ...
Bitte warten ..
Mitglied: imebro
22.11.2007 um 18:14 Uhr
@ 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
Bitte warten ..
Mitglied: imebro
23.11.2007 um 09:17 Uhr
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
Bitte warten ..
Mitglied: bastla
23.11.2007 um 12:13 Uhr
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:
01.
@echo off & setlocal 
02.
echo Es wird nach einer neuen Version von MyOH gesucht! 
03.
echo. 
04.
if not exist "c:\oh\update.exe" copy "\\dateiserver\daten\oh\updates\update.exe" "c:\oh" & goto :Starten 
05.
for /f %%i in ('replace /u /h "\\dateiserver\daten\oh\updates\update.exe" "c:\oh"') do set "Neu=%%i" 
06.
if "%Neu%" neq "1" echo Keine neue Version vorhanden! & goto :Ende 
07.
:Starten 
08.
c:\oh\update.exe 
09.
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert! 
10.
:Ende 
11.
echo. 
12.
echo. 
13.
pause
Die "xcopy"-Version würde dagegen so aussehen:
01.
@echo off & setlocal 
02.
echo Es wird nach einer neuen Version von MyOH gesucht! 
03.
echo. 
04.
for /f %%i in ('xcopy /d /h /y "\\dateiserver\daten\oh\updates\update.exe" "c:\oh"') do set "Neu=%%i" 
05.
if "%Neu%" neq "1" echo Keine neue Version vorhanden! & goto :Ende 
06.
c:\oh\update.exe 
07.
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert! 
08.
:Ende 
09.
echo. 
10.
echo. 
11.
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
Bitte warten ..
Mitglied: imebro
23.11.2007 um 12:34 Uhr
@ 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.....?....!

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

Vielen Dank nochmals.
Ingo
Bitte warten ..
Mitglied: bastla
23.11.2007 um 14:21 Uhr
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
Bitte warten ..
Mitglied: imebro
26.11.2007 um 12:40 Uhr
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
Bitte warten ..
Mitglied: bastla
26.11.2007 um 12:54 Uhr
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.

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

Grüße
bastla
Bitte warten ..
Mitglied: Biber
26.11.2007 um 15:59 Uhr
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
Bitte warten ..
Mitglied: imebro
27.11.2007 um 10:03 Uhr
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

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

Vielen Dank nochmals & Gruss,
Ingo
Bitte warten ..
Mitglied: bastla
28.11.2007 um 01:14 Uhr
Hallo imebro!

Sollte dann etwa so aussehen (ungetestet):
01.
@echo off & setlocal 
02.
set "OHInst=C:\oh\oh.exe" 
03.
set "OHUpd=\\dateiserver\daten\oh\updates\update.exe" 
04.
set "AnInst=c:\programme\hassheider datasystems\antrag\" 
05.
set "AnUpd=\\dateiserver\daten\antrag\update\antraege.exe" 
06.
 
07.
if not exist "%OHInst%" goto :Weiter 
08.
echo Es wird nach einer neuen Version von MyOH gesucht! 
09.
echo. 
10.
for %%i in ("%OHInst%") do for /f "tokens=1-5 delims=.: " %%a in ('echo %%~ti') do set DatInst=%%c%%b%%a%%d%%e 
11.
for %%i in ("%OHUpd%") do for /f "tokens=1-5 delims=.: " %%a in ('echo %%~ti') do set DatUpd=%%c%%b%%a%%d%%e 
12.
if "%DatUpd%" leq "%DatInst%" goto :Weiter 
13.
start /w "Update MyOH" "%OHUpd%" 
14.
echo Kopiervorgang beendet - das Programm MyOH wurde aktualisiert! 
15.
 
16.
:Weiter 
17.
echo. 
18.
echo. 
19.
echo. 
20.
echo Es wird nach einer neuen Version des Antragsprogramms gesucht! 
21.
for /f %%i in ('xcopy /d /u /h /r /y "%AnUpd%" "%AnInst%"') do set "Neu=%%i" 
22.
if "%Neu%" neq "1" echo Keine neue Version vorhanden oder Antragsprogramm nicht installiert! & goto :eof 
23.
echo. 
24.
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" ), 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
01.
Ist das Ziel c:\programme\hassheider datasystems\antrag ein Dateiname 
02.
oder ein Verzeichnisname 
03.
(D = Datei, V = Verzeichnis)?
Grüße
bastla

[Edit] Fehlende Anführungszeichen und ~t ergänzt. [/Edit]
Bitte warten ..
Mitglied: imebro
28.11.2007 um 11:14 Uhr
@ bastla

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

LG
Ingo
Bitte warten ..
Mitglied: imebro
28.11.2007 um 11:59 Uhr
@ 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
Bitte warten ..
Mitglied: bastla
28.11.2007 um 16:51 Uhr
Hallo imebro!

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

Die Korrektur des obigen Codes habe ich bereits vorgenommen.

Grüße
bastla
Bitte warten ..
Mitglied: imebro
28.11.2007 um 19:44 Uhr
@ bastla

...und nochmal danke!

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
Bitte warten ..
Mitglied: bastla
28.11.2007 um 19:47 Uhr
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
Bitte warten ..
Mitglied: imebro
29.11.2007 um 11:17 Uhr
@ bastla

sorry... schon wieder ich

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
Bitte warten ..
Mitglied: bastla
29.11.2007 um 12:10 Uhr
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
Bitte warten ..
Mitglied: imebro
29.11.2007 um 13:20 Uhr
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
Bitte warten ..
Mitglied: Biber
29.11.2007 um 15:11 Uhr
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
Bitte warten ..
Mitglied: imebro
30.11.2007 um 14:28 Uhr
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

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
Bitte warten ..
Mitglied: Biber
30.11.2007 um 14:34 Uhr
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
Bitte warten ..
Mitglied: imebro
30.11.2007 um 15:19 Uhr
@ 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
Bitte warten ..
Mitglied: bastla
30.11.2007 um 15:42 Uhr
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 .
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
Bitte warten ..
Mitglied: Biber
30.11.2007 um 15:47 Uhr
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:

01.
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! [/Edit]
Bitte warten ..
Mitglied: imebro
03.12.2007 um 09:13 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Netzwerk
gelöst WIN7 langames Herunterfahren mit Netzwerk (9)

Frage von Kathaki zum Thema Windows Netzwerk ...

Netzwerkmanagement
WDMYCLOUD nicht im Netzwerk sichtbar (4)

Frage von Ully45 zum Thema Netzwerkmanagement ...

Windows 10
Nach Start kein Netzwerk (11)

Frage von MegaGiga zum Thema Windows 10 ...

LAN, WAN, Wireless
gelöst Neuplanung Netzwerk mit VLAN, VOIP, Gästenetz (4)

Frage von GKKKAT zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
RODC über VPN - Verbindung weg (10)

Frage von stefan2k1 zum Thema Windows Server ...