Batch zur Aktualisierung lokaler Dateien vor Programmstart

lfjaekel

Newbie
Registriert
Juni 2019
Beiträge
3
Hallo Freunde,

ich bin neu hier und auch ein wahrer Newbie in Sachen DOS und Batch. Ich habe folgendes mit meiner Batch vor:

Ich möchte gerne bevor ich ein Programm (QGIS) starte, die lokalen Projektdateien aktualisieren. Die aktuellen Dateien liegen in einem Netzwerkpfad. Wenn das Netzwerk nicht verfügbar ist, soll eine MsgBox Abfrage Ja/Nein erscheinen. Bei Ja soll das Programm mit den alten Daten starten und bei Nein soll nichts passieren.

Folgendes habe ich schon (das ist erst mal nur ein Test mit anderer Directory und Dateien):

....

@Echo off
cd Unterordner
Copy "\\>>netzwerkpfad<<" willi.txt /Y
if ERRORLEVEL 1
(
@Echo off
echo wscript.quit MsgBox ("Die Dateien konnten nicht aktualisiert werden. Evtl. sind sie Offline. Möchten Sie QGIS dennoch öffnen?", vbYesNo, "Fehler bei der Aktualisierung") > %temp%\yesno.vbs
wscript //nologo %temp%\yesno.vbs
set value=%errorlevel%
del %temp%\yesno.vbs
if "%value%"=="6" goto Ja
if "%value%"=="7" goto end

)

cd ..
cd Unterordner2
Copy "\\>>netzwerkpfad<<" willi2.txt /Y
if ERRORLEVEL 1
(
@Echo off
echo wscript.quit MsgBox ("Es wurde nur die erste Datei aktualisiert. Möchten Sie QGIS dennoch öffnen?", vbYesNo, "Fehler bei der Aktualisierung") > %temp%\yesno.vbs
wscript //nologo %temp%\yesno.vbs
set value=%errorlevel%
del %temp%\yesno.vbs
if "%value%"=="6" goto Ja
if "%value%"=="7" goto end
)

:Ja
@Echo off
echo msgbox ("Es hat alles geklappt.",vbInformation , "Juhuu!") > %temp%\msg.vbs
%Temp%\msg.vbs
del %temp%\msg.vbs

:end

.....

Die erste Datei aktualisiert er, die zweite jedoch nicht. Es wird aber auch kein Fehler oder MsgBox angezeigt. Es geht nur kurz das DOS-Fenster auf und wieder zu. Versuche mit "pause" herauszufinden wo sich das Problem befindet, brachten nichts.

Ich weiß leider mittlerweile nicht mehr weiter und auch googlen hilft mir nicht. Findet jemand von euch meinen Fehler?

Danke euch
Gruß
Ergänzung ()

Achso ich muss dazu sagen, dass die Batch sich im Ordner befindet, in dem in Unterordnern die zu aktualisierenden Dateien liegen.

Danke noch mal!
 
nimm doch zb mal das echo off raus und führ die batch aus der cmd aus, dann sieht man auch was er macht...man müsste eben wissen was zb die "values" enthalten und ob er ggf einfach nur die zweite überspringt
 
Für so ziemlich alles was über copy und echo sowie eine banale Aneinanderreihung von simplen Kommandos hinausgeht ist Batch das falsche Werkzeug. Dazu sind die Möglichkeiten zu begrenzt, was nicht zuletzt daran zu merken ist, dass du laufend vbs Dateien bastelst und sie anschließend ausführst.

Errorlevel. Eines der größten Mankos von Batch ist der errorlevel. Der errorlevel ist extrem unzuverlässig, weil er nur von einigen Programmen überhaupt benutzt wird. Und selbst wenn, ist er alles andere als intuitiv nutzbar.

Echo off. Das macht man einmal zu Beginn der Batch.



Ich rate dir daher, stattdessen mal einen Blick auf zB Powershell zu werfen.
 
Das errorlevel ist falsch, es muss eine abfrage auf %errorlevel% == 1 erfolgen.

@Echo off

ping -n 1 %1 192.168.4.11>D:\DVBViewer\WOL\ping.log
find "angaben" /i D:\DVBViewer\WOL\ping.log


if %errorlevel% == 1 (
goto wol
) else (
goto start
)

....

Genauso würd ich die if-Schleife als einen seperaten Punkt setzen, somit sparste dir den selben (identischen) Ablauf einmal komplett ausgeschrieben - oder lass es so, mir egal. Und verwende Sprungpunkte, damit hast du viel mehr Kontrolle im Ablauf des Programms. Ebenfalls würde ich erst abfragen, ob die IP des Netzwerkpfads vorhanden ist, bevor du überhaupt kopierst.

Zum Testen kannst du auch mal die errorlevel Geschichte auskommentieren -> :: ist auskommentieren in der batch. Damit kannste schauen ob er zumindest den Ansatz des aktualisierens durchgeht - womit du das schonmal ausschließen kannst als Fehlerquelle.
 
Zuletzt bearbeitet:
Hi Leute,
Danke für die Tipps. Die haben mir sehr weiter geholfen. Ich habe es nun hinbekommen. Hier mein Script:
...

SET PFAD= ">>Netzwerkpfad<<"
if exist %PFAD% (Goto Ja)
if not exist %PFAD% (Goto Nein)

:Ja
cd Unterordner
Copy ">>Netzwerkpfad<<\>>Datei.Dateiendung<<" willi.txt /Y
cd ..
cd Unterordner2
Copy ">>Netzwerkpfad<<\>>Datei.Dateiendung<<" willi2.txt /Y
Goto QGIS

:Nein
echo wscript.quit MsgBox ("Die Dateien konnten nicht aktualisiert werden. Evtl. sind sie Offline. Möchten Sie QGIS dennoch öffnen?", vbYesNo, "Fehler bei der Aktualisierung") > %temp%\yesno.vbs
wscript //nologo %temp%\yesno.vbs
set value=%errorlevel%
del %temp%\yesno.vbs
if "%value%"=="6" goto QGIS
if "%value%"=="7" goto end


:QGIS
echo msgbox "Es hat alles geklappt.",vbInformation , "Juhuu!" > %temp%\msg.vbs
%temp%\msg.vbs
del %temp%\msg.vbs

:End

....

See y'all
 
Ein paar Tips zur potentiellen Verbesserung und/oder für die Zukunft:

cd und cd .. sind in der Regel keine gute Idee, da sie vom Ort der Batch-Datei abhängig sind. Selbst wenn du bei cd absolute Pfade verwendest, macht dir Windows einen Strich durch die Rechnung, wenn die Batch auf einem anderen Laufwerk liegt. Natürlich kann man dafür sorgen, dass die Batch immer richtig liegt, aber ich würde es vom Ort unabhängig programmieren, wenn nichts explizit dagegenspricht.

Code:
SET srcpath=\\einserver\einefreigabe\einverzeichnis
SET dstfile1=c:\bla\blubb\willi.txt
SET dstfile2=c:\bla\blubberdiblubb\willi2.txt

copy %srcpath%\eine.datei %dstfile1% /Y
copy %srcpath%\andere.datei %dstfile% /Y

In dieser Form ist es vollkommen egal wo die Batch-Datei liegt, weil auf etwaige Verzeichnisnavigation verzichtet wird und copy direkt die absoluten Pfade verwendet.


Auch würde ich den ganzen Rotz mit dem vbscript wegschmeißen. Wenn dir der Sprachumfang von Batch nicht ausreicht, nutzt du die falsche Skript"sprache", wenn man Batch denn nu unbedingt so bezeichnen möchte. Man kann auch mit Batch Eingaben vom Nutzer verarbeiten:

Code:
SET /P eingabe=Trotzdem starten? (j/n)
IF "%eingabe%"=="j" GOTO:QGIS
GOTO:EOF

Auf "n" muss man nicht mehr prüfen, da alles außer "j" durchfällt und somit GOTO:EOF aufgerufen wird. EOF ist ein Label, das bereits auf das Dateiende zeigt. :End ist daher überflüssig. Wenn man mag, kann man noch ein IF mit "J" dazwischenschieben, um (un)beabsichtigt aktivertes CAPS LOCK abzufangen.

Generell würde ich die Labels auch präziser benennen. In einer kleinen Batch mag das unerheblich sein, aber man sollte sich angewöhnen, sprechende Namen zu verwenden, grundsätzlich, immer, überall. ":Ja" und ":Nein" sind ohne Kontext nicht aussagekräftig, zB ":COPYPROJECT" bzw. ":STARTOFFLINE" hingegen schon.

:QGIS ist auch nicht wirklich eindeutig. Egal ob nu mit aktuellen oder veralteten Daten gestartet wurde, in beiden Fällen kommt "Juhu".



Ob du die Tips in dein Skript einbaust, bleibt natürlich dir überlassen. Wenn's so läuft wie gewünscht, dann läuft es so. Sind nur ein paar Ratschläge für die Zukunft.
 
  • Gefällt mir
Reaktionen: IT_Nerd
Hi Raijin,
danke für die Tips! Wie ein Profi sicher bemerkt haben wird, kann ich die gut gebrauchen ;-)

Leider muss ich mit cd rumhantieren. Die Batch wird an ein paar Leute verteilt, die auf das gleiche Projekt zugreifen. Leider hat man es von Anfang an versäumt einen einheitlichen Speicherort der sonst überwiegend einheitlichen Ordnerstruktur zu verwenden. Also liegt das bei jedem User anderswo.

Die Nutzereingabe hatte ich als Plan B im Kopf, da ich das etwas zu verkrampft fand (UA). Das Script in einer anderen "Sprache" zu schreiben, übersteigt glaube ich meine sehr begrenzten Vorkenntnisse. Daher dachte ich heiligt der Zweck das Missbrauchen von Vb.

Bei den Labels gebe ich dir natürlich Recht. Das hat mich hier und da beim herumprobieren auch ein Beinchen gestellt. Bei :QGIS soll es aber genauso sein. Denn "Juhuu" ist lediglich ein Platzhalter für das Starten des Programms. Wenn ich fertig bin, soll an der Stelle kommentarlos QGIS geöffnet werden.

Noch einmal: Vielen Dank!
 
Das Script in einer anderen "Sprache" zu schreiben, übersteigt glaube ich meine sehr begrenzten Vorkenntnisse.
Ich denke, du stellst da dein Licht unter den Scheffel.
Raijin hat recht, dass auch Batch eine Ja/Nein-Abfrage direkt abwickeln kann. Mir selbst gefällt sie etwas handzahmere VBS-Lösung ganz gut. Daher mal der Anstoß mit ein bisschen Google-Hilfe das komplett in VBS abzuwicklen.

CN8
 
cumulonimbus8 schrieb:
Daher mal der Anstoß mit ein bisschen Google-Hilfe das komplett in VBS abzuwicklen.
Zum Beispiel. Batch ist nämlich genau das was der Name sagt: "Stapelverarbeitung". Heißt im Klartext, dass es sich vorwiegend dafür eignet, eine Sequenz von Befehlen nacheinander abzuarbeiten. Alles was darüber hinausgeht ist in Batch unheimlich aufwendig und alles andere als intuitiv.

Wenn man jedoch unbedingt vbs in Batch nutzen möchte und dies auch mehrfach tut, würde ich den Code dafür aber kapseln.


Code:
@ECHO OFF

SET srcpath=\\server\freigabe\verzeichnis

IF NOT EXIST %srcpath% GOTO:STARTOFFLINE
GOTO:COPYPROJECT


:COPYPROJECT
ECHO do some copy stuff
GOTO:RUNMYAPP

:RUNMYAPP
CALL:MSGBOX "Und ab geht die wilde Fahrt!" "Juhuu!"
REM run the app ;)
GOTO:EOF

:STARTOFFLINE
CALL:MSGBOX "Die Dateien konnten nicht aktualisiert werden. Evtl. sind sie Offline. Möchten Sie QGIS dennoch öffnen?" "Fehler bei der Aktualisierung" vbYesNo
IF "%returnvalue%"=="6" GOTO:RUNMYAPP
IF "%returnvalue%"=="7" CALL:MSGBOX "Vielleicht  beim nächsten Mal" "Ciao!"
GOTO:EOF


:MSGBOX
REM Aufruf: CALL:MSGBOX text titel param
SET boxtext=%~1
SET boxtitel=%~2
SET boxparam=%~3
IF "%boxparam%"=="" SET boxparam=vbInformation

ECHO wscript.quit msgbox ("%boxtext%",%boxparam% , "%boxtitel%") > %temp%\msgbox.vbs
wscript //nologo %temp%\msgbox.vbs

SET returnvalue=%errorlevel%
del %temp%\msgbox.vbs
GOTO:EOF

Mit Call kann man Labels auch als Funktion aufrufen. Das heißt, dass der Interpreter in das Label reinspringt und wenn er ans Ende des Labels kommt (also das GOTO:EOF am Ende des Labels), springt er wieder dahin zurück wo er vorher war und macht da weiter. Das vbs-Gedöns ist gekapselt und man kann zB nicht vergessen, am Ende die temporäre .vbs Datei zu löschen, weil man's ja einmal so definiert hat.
 
Zurück
Oben