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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 32297
Url: https://administrator.de/contentid/32297
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
6 Kommentare
Neuester Kommentar
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?
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
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
Moin Odi,
fein, wenn es jetzt läuft - dann könnten wir beide jetzt eigentlich mit dem Wochenende anfangen..
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
fein, wenn es jetzt läuft - dann könnten wir beide jetzt eigentlich mit dem Wochenende anfangen..
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