Ja, es gibt wirklich noch Leute, die Windows 98 SE im Einsatz haben.
Hierfür habe ich einige Skripte geschrieben, welche nächtlich einen Ordner packen und per Netzwerk auf ein Synology NAS verschieben.
Leider war der Funktionsumfang unter Windows 98 SE noch recht eingeschränkt. Somit musste ich einige Klimmzüge machen, damit alles wie gewünscht funktioniert. Ich konnte nicht, wie gedacht, einfach alles mit Batch Skripte erledigen, sondern musste auf WScript und vbs ausweichen.
Schwierig gestaltete sich schon das auslesen der aktuell Uhrzeit, um diese in ein Logfile zu schreiben, da der “time” Befehl unter Windows 98 SE nicht die Uhrzeit ausgibt sondern nur zum setzen der Systemzeit genutzt werden kann.
Hierfür muss unter Windows 98 SE der Windows Scripting Host installiert sein. Start -> Einstellungen -> Systemsteuerung -> Software -> Windows Setup -> Zubehör
Zudem habe ich eine alte 7zip Version (9.20) eingesetzt, welche noch unter Windows 98 lauffähig ist. Bei dieser Backupmethode hätte ich auch einfach alle Dateien ungepackt auf das NAS kopieren können. Der zu sichernde Ordner enthält jedoch tausende kleine Dateien. Dadurch dauert das Kopieren mehr als 1 Stunde. Mit 5 Minuten Laufzeit ist es viel schneller erst den Ordner zu packen und anschließend auf das NAS zu verschieben.
Die 7zip Kommandos findet man hier: https://sevenzip.osdn.jp/chm/cmdline/syntax.htm
Als erstes starte ich ein Script welches die nach einer kurzen Wartezeit (30 Sekunden), bei jedem Systemstart, prüft ob die vorige Sicherung erfolgreich durchgelaufen ist.
Sollte dies nicht der Fall sein, wird eine Meldung angezeigt und der Anwender kann eine manuelle Sicherung starten.
In jedem Fall wird das aktuelle Datum und die aktuelle Zeit in eine Datei geschrieben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
'--Logging vorbereiten-- Set object = WScript.CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") Set LASTRUN = objFSO.OpenTextFile("C:\lastrun.txt", 1) Set Boottime = objFSO.OpenTextFile("C:\boottime.txt", 2) strText = "Sicherung jetzt wiederholen?" strTitle = "Die Sicherung ist fehlgeschlagen!" cmd = "C:\BAC_rerun.vbs" 'wscript.sleep 30000 Do While LASTRUN.AtEndOfStream <> True TextLine = LASTRUN.ReadLine IF TextLine <> "OKAY" THEN intButton = object.Popup(strText,0,strTitle,53) Select Case intButton case 2 ' Abbruch 'wscript.echo("Abbruch") MsgBox "Die Sicherung wird heute Nacht wiederholt.", 64, "Sicherung" case 4 ' Wiederholen wscript.echo("Bitte Software waehrend der Sicherung NICHT benutzen!") object.Run cmd,1,false End Select END IF Loop LASTRUN.close Boottime.WriteLine Date Boottime.WriteLine Time Boottime.Close Wscript.quit |
Der Computer wird nächtlich über eine im BIOS hinterlegte Uhrzeit gestartet. Anschließend führt Windows 98 das folgende Sicherungsskript aus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
'--Logging vorbereiten-- Set objFSO = CreateObject("Scripting.FileSystemObject") Set objNW = CreateObject("WScript.Network") Set myLog = objFSO.OpenTextFile("C:\log.txt", 8, true) Set LASTRUN = objFSO.OpenTextFile("C:\lastrun.txt", 2, true) Set Boottime = objFSO.OpenTextFile("C:\boottime.txt", 1) LASTRUNtext = "OKAY" 'Zeit des Windowsstarts aus Datei lesen. Datum = Boottime.ReadLine Zeit = Boottime.ReadLine Startup = Datum & " " & Zeit myLog.WriteLine Date & " " & Time & "Start" '--Get current year-- strYear = DatePart("yyyy",Date) '--Get current month, add leading zero if necessary-- If DatePart("m",Date) < 10 Then strMonth = 0 & DatePart("m",Date) Else strMonth = DatePart("m",Date) End If '--Get current day, add leading zero if necessary-- If DatePart("d",Date) < 10 Then strDay = 0 & DatePart("d",Date) Else strDay = DatePart("d",Date) End If myLog.WriteLine Date & " " & Time & " Los gehts" '--Check ob Netzlaufwerk bereits verbunden-- IF (objFSO.DriveExists("S:")) THEN ELSE '--Netzlaufwerk verbinden-- On Error Resume Next objNW.MapNetworkDrive "S:", "\\Synology\Backup" If Err.Number <> 0 then Fehler = Err.Number & " " & Err.Description Call ErrorHandler END IF END IF '--Programmparameter-- Set WshShell = WScript.CreateObject("WScript.Shell") Command = "C:\Programme\7-Zip\7z.exe a -t7z -mx0 -ms=off S:\" & strYear & strMonth & strDay & "Archivname.7z C:\Software\*" ComChk = "C:\Programme\7-Zip\7z.exe t S:\" & strYear & strMonth & strDay & "Archivname.7z *" '--Run 7zip and catch the result-- Return = WshShell.Run (Command,1,true) 'Errorhandling myLog.WriteLine Date & " " & Time & " Schritt: 7zip Packprozess beendet mit Returncode: " & Return If Return > 0 Then Fehler = Return Call ErrorHandler End If '--Run 7zip test to check integrity of archive-- ReturnChk = WshShell.Run (ComChk,1,true) 'Errorhandling myLog.WriteLine Date & " " & Time & " Schritt: 7zip Pruefprozess beendet mit Returncode: " & ReturnChk If ReturnChk > 0 Then Fehler = ReturnChk Call ErrorHandler End If '--Netzlaufwerk trennen-- On Error Resume Next objNW.RemoveNetworkDrive "S:" If Err.Number <> 0 then Fehler = Err.Number & Err.Description Call ErrorHandler END IF Call Ende Sub ErrorHandler 'wscript.echo(Fehler) myLog.WriteLine Date & " " & Time & " !!!Fehler!!! " & Fehler LASTRUNtext = Date & " " & Time & " !!!Fehler!!! " & Fehler Call Ende End Sub Sub Ende myLog.WriteLine Date & " " & Time & " Vorgang abgeschlossen." 'Zeitdifferenz zwischen jetzt und Startzeit ermitteln & Shutdown einleiten. DiffADate = DateDiff("n", Now, Startup) If DiffADate < -60 Then 'PC wird nicht heruntergefahren, da die Software vermutlich noch läuft. myLog.WriteLine Date & " " & Time & " PC wird nicht heruntergefahren." Else 'Shutdown, da zwischen Bootzeit und Sicheurng weniger als 60 Minuten liegen. 'somit wird davon ausgegangen, dass die Software nicht läuft. myLog.WriteLine Date & " " & Time & " Windows wird heruntergefahren." WshShell.Run "C:\Windows\RUNDLL32.EXE user,exitwindows",1,false End If Boottime.Close myLog.close LASTRUN.Write LASTRUNtext LASTRUN.close wscript.quit End Sub |
Das folgende Skript ist eine leicht abgewandelte Form des nächtlichen Sicherungsskripts, welches aufgerufen wird, wenn der Anwender es manuell über das Hinweisfenster (aus Skript 1 – startup.vbs) aufruft.
Es ruft am Ende keinen Shutdown Befehl auf.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
'--Logging vorbereiten-- Set objFSO = CreateObject("Scripting.FileSystemObject") Set objNW = CreateObject("WScript.Network") Set myLog = objFSO.OpenTextFile("C:\log.txt", 8, true) Set LASTRUN = objFSO.OpenTextFile("C:\lastrun.txt", 2, true) LASTRUNtext = "OKAY" myLog.WriteLine Date & " " & Time & "Start" '--Get current year-- strYear = DatePart("yyyy",Date) '--Get current month, add leading zero if necessary-- If DatePart("m",Date) < 10 Then strMonth = 0 & DatePart("m",Date) Else strMonth = DatePart("m",Date) End If '--Get current day, add leading zero if necessary-- If DatePart("d",Date) < 10 Then strDay = 0 & DatePart("d",Date) Else strDay = DatePart("d",Date) End If myLog.WriteLine Date & " " & Time & " Los gehts" '--Check ob Netzlaufwerk bereits verbunden-- IF (objFSO.DriveExists("S:")) THEN ELSE '--Netzlaufwerk verbinden-- On Error Resume Next objNW.MapNetworkDrive "S:", "\\Synology\Backup" If Err.Number <> 0 then Fehler = Err.Number & " " & Err.Description Call ErrorHandler END IF END IF '--Programmparameter-- Set WshShell = WScript.CreateObject("WScript.Shell") Command = "C:\Programme\7-Zip\7z.exe a -t7z -mx0 -ms=off S:\" & strYear & strMonth & strDay & "Archivname.7z C:\Software\*" ComChk = "C:\Programme\7-Zip\7z.exe t S:\" & strYear & strMonth & strDay & "Archivname.7z *" '--Run 7zip and catch the result-- Return = WshShell.Run (Command,1,true) 'Errorhandling myLog.WriteLine Date & " " & Time & " Schritt: 7zip Packprozess beendet mit Returncode: " & Return If Return > 0 Then Fehler = Return Call ErrorHandler End If '--Run 7zip test to check integrity of archive-- ReturnChk = WshShell.Run (ComChk,1,true) 'Errorhandling myLog.WriteLine Date & " " & Time & " Schritt: 7zip Pruefprozess beendet mit Returncode: " & ReturnChk If ReturnChk > 0 Then Fehler = ReturnChk Call ErrorHandler End If '--Netzlaufwerk trennen-- On Error Resume Next objNW.RemoveNetworkDrive "S:" If Err.Number <> 0 then Fehler = Err.Number & Err.Description Call ErrorHandler END IF Call Ende Sub ErrorHandler 'wscript.echo(Fehler) myLog.WriteLine Date & " " & Time & " !!!Fehler!!! " & Fehler LASTRUNtext = Date & " " & Time & " !!!Fehler!!! " & Fehler Call Ende End Sub Sub Ende myLog.WriteLine Date & " " & Time & " Vorgang abgeschlossen." myLog.close LASTRUN.Write LASTRUNtext LASTRUN.close wscript.quit End Sub |