Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Win11 boykottiert Batchdateien :-(

Begonnen von Doming, November 12, 2025, 06:55:59

⏪ vorheriges - nächstes ⏩

Doming

Hallo,

ja, zugegeben, der Titel ist etwas populistisch, aber vielleicht habt Ihr ja eine Lösung.

Die von mir erstellten Datenbanken werden planmäßig über eine Batchdatei aufgerufen.
Darin wird zuerst das Frontend von einem Netzlaufwerk auf den lokalen Rechner kopiert und dann dort gestartet. So ist es für mich einfacher, Änderungen unter den Anwendern zu verteilen.
Weiterhin kopiert die Batch auch eine Verknüpfung (auf sich selbst) auf den Desktop des Rechners, damit sie bequem von dort aus gestartet wird.

Nun war ich anhand einer Logdatei darüber verwundert, dass die neuste Version nicht auf jedem Rechner läuft. Als ich einem der Anwender über die Schulter gesehen habe, konnte ich feststellen, dass sie nicht, wie früher, vom Desktop aus starten, sondern über die ,,Empfohlen"-Funktion von Win11. Letztere listet auf, welche Programme zuletzt auf dem Rechner gestartet wurden (Druck auf die Windows-Taste).
So wird natürlich direkt auf das lokale FrontEnd zugegriffen, ohne dass irgendwas vorher kopiert wurde.

Mir will gerade nicht einfallen, wie ich die Funktion der Batchdatei in meine Datenbank eingebaut bekomme. Klar kann ich mit VBA auch Dateien kopieren, aber leider ja nicht sich selbst...

Habt Ihr da Ideen?

Gruß
 Doming

Doming

...wenn ich so darüber nachdenke... man könnte von Access aus eine Batchdatei starten und sich selbst dann beenden, die Batchdatei kopiert wie bisher dann die neue Version und startet neu... möglicherweise mit einem Wartetimer, damit Access Zeit hat, sich zu beenden...

Damit das nicht in einer Endlosschleife ausartet, könnte man eine NullDatei im Netzlaufwerk (oder besser in einer Tabelle) platzieren, die dann die Versionsnummer beinhaltet und bei Differenz den Update-Prozess in Access in Gang setzt.

Bitsqueezer

Hallo,

Du könntest auch einfach eine Versionsnummer in einer lokalen Tabelle speichern und mit einer Versionsnummer auf dem Server vergleichen.
Paßt es nicht, kannst Du den User darauf hinweisen, den Desktop-Link zu verwenden bzw. Access kann diesen auch neu erstellen, falls er fehlt.

Das erzieht die User gleich, immer den richtigen Weg zu benutzen.

Gruß

Christian

Doming

User erziehen wäre eine schöne Idee, allerdings sitze da einige am Rechner, die so gar keine Lust auf Computer haben und nur das Nötigste machen, weil sie dienstlich dazu verpflichtet sind. Und um nicht gegen Windmühlen anzukämpfen, automatisiere ich die Geschichte nach Möglichkeit.

MzKlMu

Hallo,
Batchdateien gehören zu den ausführbaren Dateien. Da sollte man auch auf die Sicherheitseinstellungen der Rechner achten.
Gruß Klaus

Bitsqueezer

Hallo,

ich will's mal so sagen: Wenn sich die Anwendung beendet, wenn sie nicht in der richtigen Version läuft, erledigt sich das beim User von ganz allein.

Darüber hinaus ist es auch ein Sicherheitsfeature, weil nicht falsche Frontends mit neueren Backends arbeiten, was problematisch sein kann.

Ich würde den Versionscheck sogar bei jedem Öffnen eines Formulares/Berichts mit einbauen, weil Access das Feature hat, daß man ein Formular/einen Bericht per Drag&Drop auf den Desktop ziehen und damit jede Startfunktion aushebeln kann, weil Access bei Doppelklick auf so einen Link das Formular/den Bericht direkt öffnet, ohne Autoexec, ohne Startformular.

Gruß

Christian

Doming

Hallo,

ich habe das jetzt folgendermaßen gelöst:
Um die Updategeschichte in meinen DBs universell einsetzen zu können, gibt es in Ihnen die Konstanten Prog und Versio.
Es gibt eine Tabelle mit den verschiedenen Datenbanken und deren Softwareständen.
Nach jeder Neuerung in der Datenbank wird diese Sub aufgerufen
Public Sub SWNeustand()
 Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM tbl_SWStand WHERE Prog = '" & Prog & "'")
    If rs.BOF And rs.EOF Then
        rs.AddNew
        MsgBox "Nicht vergessen: Pfad des FrontEnds ergänzen!", 0, "Eintrag hinzugefügt"
    ElseIf Versio <> rs!SWStand Then
        rs.Edit
    Else
        GoTo Ende
    End If
    rs!Prog = Prog
    rs!SWStand = Versio
    rs!StandDatum = Date
    rs.Update
Ende:
    rs.Close
    Set rs = Nothing
End Sub

Natürlich kann man das auch händisch einpflegen, aber so geht das universeller.

Beim Start der Db wird dann diese Sub aufgerufen:
Public Sub SWCheck()
 Dim rs As DAO.Recordset
 Dim Dateiname As String
 Dim BatName As String
 Dim BatAufruf As String
   
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM tbl_SWStand WHERE Prog = '" & Prog & "'")
    If Not (rs.EOF And rs.BOF) Then
        If rs!SWStand <> Versio Then

            BatName = Application.CurrentProject.Path & "/DBUpdater.bat"
            If Dir(BatName) = "" Then
                FileCopy "C:\Referenzverzeichnis\DBUpdater.bat", BatName
            End If
           
            Dateiname = Application.CurrentProject.Path & "/UrDatei.accdb"
           
            On Error Resume Next
            Kill Dateiname
            On Error GoTo 0
           
            BatAufruf = BatName & " " & Prog & " " & Application.CurrentProject.Path
            FileCopy rs!urdatei, Dateiname
            Call Shell(BatAufruf, vbNormalFocus)
            DoCmd.Quit
        Else
            Debug.Print "Softwarestand " & Versio & " ist aktuell"
        End If
    Else
        Debug.Print "Ich finde die Ursprungsdatei (" & Prog & ") nicht!"
    End If
    rs.Close
    Set rs = Nothing
End Sub

Diese kopiert mir die Originaldatei in mein Arbeitsverzeichnis, startet die Batchdatei und beendet dann die Datenbank.
Um auch diesen Vorgang universell zu halten, gebe ich den Datenbanknamen und das Arbeitsverzeichnis beim Batchaufruf als Parameter mit.

Die  Batchddatei sieht dann so aus:
@echo off

rem Aufruf mit: ---Updater Neudateiname Arbeitsverzeichnis--- es wird ein .accdb angefuegt

setlocal enabledelayedexpansion

rem Prüfen, ob Parameter übergeben wurde
if "%~1"=="" (
    set /p NeuerName="Bitte neuen Dateinamen (ohne Endung) eingeben:"
) else (
    set NeuerName=%~1
)
if "%~2"=="" (
    echo Es fehlt der zweite Parameter
    goto Ende
) else (
    set Verzeichnis=%~2
)

cd /d !Verzeichnis!
cls

if not exist "Urdatei.accdb" (
    echo Urdatei nicht gefunden
    echo Beende den Updater
    pause
    goto Ende
)

set NeuerName=%NeuerName%.accdb
set Laufvar=1
set MaxVersuche=5
:Loop
echo ------------------
echo !Laufvar!. Versuch
set /a RestVersuche=MaxVersuche-Laufvar

rem Wenn keine .laccdb existiert → umbenennen und beenden
if not exist *.laccdb (
    del "%NeuerName%"   
    ren Urdatei.accdb "%NeuerName%"
    if %ERRORLEVEL% EQU 0 (
        echo Vorgang beendet.
        start "" "%Neuername%"
    ) else (
        echo Fehler: Umbenennung fehlgeschlagen!
    )
    goto Ende
)
echo Die zu aktualisierende Datenbank wurde noch nicht korrekt beendet!
echo ich versuche es in 3 Sekunden nochmal
echo (noch !RestVersuche! Versuche uebrig)

timeout /t 3 >nul

rem Maximal 5 Versuche
if !Laufvar! GEQ 5 goto Ende

set /a Laufvar+=1
goto loop
:Ende
exit

Sie benennt die QuellDatenbank um und startet sie dann neu. Sollte die DB vorher noch nicht beendet worden sein, wird dieser Vorgang noch weitere 4 Male versucht, bevor sich die Batchdatei dann beendet.
Bei meinem Test dauerte der Vorgang keine 3 Sekunden, ich bin zufrieden.

Gruß
 Doming