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-Key: 32297

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

Printed on: April 24, 2024 at 02:04 o'clock

Member: ahe
ahe May 12, 2006 at 12:39:54 (UTC)
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
Member: Biber
Biber May 12, 2006 at 16:57:10 (UTC)
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
Member: odicin
odicin May 12, 2006 at 17:24:59 (UTC)
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
Member: odicin
odicin May 12, 2006 at 18:30:54 (UTC)
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
Member: Biber
Biber May 12, 2006 at 20:06:29 (UTC)
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
Member: odicin
odicin May 13, 2006 at 15:46:29 (UTC)
Goto Top
Is ne richtig gute Idee Biber, werd ich einbauen.

Gruß Odi