odicin
Goto Top

Batch-Programmierung - Wo ist der Fehler?

Folgende Problemstellung:
Ein Programm wird vom Server aus von einem Client aktualisiert. Auf dem Server ist eine Datei mit einer Versionsnummer, im Programmverzeichnis des Clients auch. Ist die auf dem Server eine höhere, wird aktualisiert. Das ganze läuft übers Login-Script bei Anmeldung des Clients. Soweit so gut. Wenn das Programm allerdings vom Client übers Autostart-Menü gestartet wird, kann die Aktualisierung nicht korrekt ausgeführt werden, da Teile des Programms im Zugriff sind. Mittels pskill (von Sysinternals) kann ich das Programm vor der Aktualisierung zwar schließen, allerdings soll es natürlich nur dann geschlossen werden, wenn eine Aktualisierung ansteht. Folgendes Script ist im Moment im Einsatz, funktioniert aber nicht ordnungsgemäß. Das Programm wird im Moment immer geschlossen.

<-- beginn code -->
FOR /F "TOKENS=1*" %%a IN (\\SERVER\Programm\Update_Client\UpdateVersion.Dat) DO (
SET /A server=%%a
)

FOR /F "TOKENS=1*" %%b IN (C:\Programme\Programm\UpdateVersion.Dat) DO (
SET /A lokal=%%b
IF NOT [%lokal%]==[%server%] \\SERVER\Programm\Update_Client\pskill.exe programm.exe
)
\\SERVER\Programm\Update_Client\UnattendedInstallation.exe
<-- end code -->

Wo liegt hier der Fehler? Normalerweise dürfte er die pskill nur dann ausführen, wenn die Versionsnummern nicht übereinstimmen. Es wird aber immer aufgerufen.

Gruß Odi

Content-ID: 32297

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

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

ahe
ahe 12.05.2006 um 14:39:54 Uhr
Goto Top
Hallo Odi,

mach' 'mal hier ein paar Leerzeichen, hinter bzw. vor den Gleichzeichen ...

IF NOT [%lokal%] == [%server%]

Danach hat es bei mir funktioniert. (Windows XP SP2)

mfg
Axel
Biber
Biber 12.05.2006 um 18:57:10 Uhr
Goto Top
Moin Odi, Moin Axel,

ich sehe hier keinen Grund für ein Stochern im Nebel.

Fakt ist:
- pskill wird ausgeführt
- das kann nur sein, wenn [%lokal%] und [%server%] nicht gleich sind
- das wiederum können wir doch anzeigen lassen.

Problem werden eventuell nicht fehlende, sondern überzählige Leerzeichen sein, aber wozu spekulieren?
FOR /F "TOKENS=1*" %%a IN (\\SERVER\Programm\Update_Client\UpdateVersion.Dat) DO (  
SET /A "server=%%a"  
)
:: Rem Frage: Wozu auf Numerischen Wert casten?? 
:: Rem Frage :Und was,  wenn bei Version 2.00 oder 2.1a drinsteht??
:: Rem Und warum "Tokens=1*" statt Tokens ganz wegzulassen? Wenn numerisch, gibts eh nur 1 Token 

FOR /F "TOKENS=1*" %%b IN (C:\Programme\Programm\UpdateVersion.Dat) DO (  
SET /A "lokal=%%b"  
)
:Rem Vergleich gehört nicht in die FOR..IN..DO-Anweisung
IF NOT [%lokal%]==[%server%] echo  Lokal [%lokal%] NEQ Server[%server%] !!
pause
IF NOT [%lokal%]==[%server%] \\SERVER\Programm\Update_Client\pskill.exe programm.exe

\\SERVER\Programm\Update_Client\UnattendedInstallation.exe

Ich habe erstmal eine Anzeige (echo... paus) eingebaut zum Testen.
Da kannst Du erst mal sehen "wie" unterschiedlich die Werte sind.
Und ggf. mir Strg-C abbrechen, bevor der Pskill losrennt.
Vielleicht ist nur ein Leerzeichen/eine Leerzeile/unsinn in einer Versions.dat.
Oder eine der Dateien Fehlt. Du prüfst ja nichts davon ab.

HTH
Biber
odicin
odicin 12.05.2006 um 19:24:59 Uhr
Goto Top
:: Rem Frage: Wozu auf Numerischen Wert
casten??
:: Rem Frage :Und was, wenn bei Version
2.00 oder 2.1a drinsteht??

Die Versionsnummern in den Datein werden nur für die UnattendedInstallation beim Update genutzt und sind numerische Zahlen, ab eins an. ATM irgendwo bei 40. Daher der numerische Wert. Es steht auch nur der Wert drin, nichts weiter. Das Programm hat, da hast du Recht andere Versionsnummern, aber die werden für das Client-Update nicht herrangezogen.

:: Rem Und warum "Tokens=1*" statt
Tokens ganz wegzulassen? Wenn numerisch,
gibts eh nur 1 Token

Hmm... wusst ich noch nich Gute Idee...

:Rem Vergleich gehört nicht in die
FOR..IN..DO-Anweisung

Ok


IF NOT [%lokal%]==[%server%] echo Lokal
[%lokal%] NEQ Server[%server%] !!
pause
IF NOT [%lokal%]==[%server%]
\\SERVER\Programm\Update_Client\pskill.exe
programm.exe
Ich habe erstmal eine Anzeige (echo... paus)
eingebaut zum Testen.
Da kannst Du erst mal sehen "wie"
unterschiedlich die Werte sind.

Ok, werd ich ausprobieren.

Oder eine der Dateien Fehlt. Du prüfst
ja nichts davon ab.

Brauche ich eigentlich nicht, da wenn angenommen auf demClient die Datei fehlt, ist dort das Programm nicht installiert und der Aufruf von pskill geht am Clientrechner ins Leere. Ist zwar nicht schön, richtet aber in dem Fall am Client-Rechner auch keinen Schaden an.

Gruß Odi
odicin
odicin 12.05.2006 um 20:30:54 Uhr
Goto Top
Ergebnis: Die Sache funktioniert. Das einzige was ich geändert habe, war die IF NOT-Abfrage nicht in der FOR-Schleife laufen zu lassen. Das eingebaute Echo hatte auch die korrekten Parameter angezeigt und ich hab die ganze Sache auch nochmal zur Sicherheit am entsprechenden Client-Rechner getestet.

Mich wundert es zwar ein wenig das es daran gelegen haben soll, aber nun gut. Jetzt läuft die Sache.

Gruß Odi
Biber
Biber 12.05.2006 um 22:06:29 Uhr
Goto Top
Moin Odi,

fein, wenn es jetzt läuft - dann könnten wir beide jetzt eigentlich mit dem Wochenende anfangen.. face-wink

Ein Tipp noch:
Die zwei Zeilen

IF NOT [%lokal%]==[%server%] echo Lokal [%lokal%] NEQ Server[%server%] !!
pause

würde ich nicht ganz entsorgen.
Sondern grundsätzlich jeden Unterschied/Update in eine Serverlogdatei schreiben.

IF NOT [%lokal%]==[%server%] (
echo %date% %computername% von [%lokal%] auf [%server%] >>serverXY\freigabeZ\Clientupdates.log
)

Dann kannst Du hinterher sehen, wer wann upgedated hat und warum.

Schönes Wochenende
Biber
odicin
odicin 13.05.2006 um 17:46:29 Uhr
Goto Top
Is ne richtig gute Idee Biber, werd ich einbauen.

Gruß Odi