Batch Verarbeitung XP: CMD und Text

QuHno

Außer Betrieb
Folgendes Problem:
Ich habe einen Ordner, voll mit .exe Dateien (MS Update Dateien). In diesen Ordner werden in regelmäßigen Abständen neue .exe Dateien hinzugefügt, die einmal installiert werden sollen und dann eigentlich nie wieder angepackt werden sollen, außer man installiert mal wieder die entsprechnde Software neu.

Da ich nicht jede einzelne Datei anklicken will, habe ich mir eine kleine CMD Datei geschrieben, die sich durch den Ordner fräst und alle Dateien nacheinander installiert (Codeausschnitt):
Code:
ECHO Installation aller Updates dieses Verzeichnisses ...

FOR /f %%i IN ('DIR /b *.exe') DO (
	ECHO Installiere %%i ...
	%%i /passive /quiet /norestart
	ECHO %%i installiert ...
	ECHO.
)

ECHO Installation aller Updates abgeschlossen ...
Das klappt auch ohne Probleme unter XP und Vista. Nun wollte ich in eine kleine Textdatei hineinschreiben, welche der Dateien installiert wurden, das war auch kein Problem, ich musste lediglich folgendes nach ECHO. einfügen:
Code:
echo %%i >> test.txt
Nun dachte ich mir, dass man diese Text Datei eventuell missbrauchen könnte, um zu erkennen, welche der Updates noch nicht installiert sind und diese dann zu installieren.
Dazu kann ich ja am Anfang der Batch mittels
Code:
IF EXIST test.txt GOTO
überprüfen, ob die test.txt Datei vorhanden ist und dann passend verzweigen.

Die einzelnen Zeilen der TXT Datei kann ich ja mit
Code:
FOR /f %%K IN (test.txt) DO
auslesen.

... und jetzt verließen sie ihn. Irgendwie fehlt mir der Ansatz, wie ich weiter machen soll (kann auch an der fiebrigen Erkältung liegen, wahrscheinlich ist es trivial). Ich dachte zuerst an FIND, aber irgendwie bekomme ich es nicht gebacken, FIND beizubiegen, dass es den Inhalt der Variablen %%i als Suchbegriff nehmen soll...

Falls jemandem ein völlig anderer Ansatz einfällt, wie ich das Problem geknackt bekomme, wäre das auch willkommen.

Ja, man könnte das ganze natürlich in einer echten Programmiersprache schreiben, aber ich finde, für so ein kleines Teil ist das ein wenig wie mit Kanonen auf Spatzen schießen, irgendwie muss das doch auch so zu lösen sein...

PS: Nicht über die Power Shell, es muss auch auf XPs laufen, die diese nicht installiert haben...
 
Nun dachte ich mir, dass man diese Text Datei eventuell missbrauchen könnte,
um zu erkennen, welche der Updates noch nicht installiert sind
Das geht nur über Auslesen der Registry...
Aber das machen die Updates schon selbst, nur so am Rande ;)
 
Neee Brummelchen..

das macht QuHno doch selbst mit dem Vergleich Logdatei<=>Verzeichnis, nur das WIE GENAU ist das Problem. Im übrigen hinterlässt nicht jede Installation auch etwas in der Registry.

QuHno: Schreib doch hinter dein DO eine weitere Logdatei, diesmal NUR mit den Dateien, die NICHT vorkommen. Am Ende der ersten Logdatei rufst du dann eine Batch auf (batch aus batch ausrufen geht!), welche die 2. abarbeitet und dabei jeden Eintrag in die erste Logdatei hinzufügt.
Danach wird die 2. Logdatei gelöscht oder geleert.

LG
 
Im übrigen hinterlässt nicht jede Installation auch etwas in der Registry.
Richtig, aber das ist unwichtig... glaub's einfach mal ;)
Und wenn, es ist ja machbar, ist der Aufwand dafür extrem hoch, weil du
zB Versionsnummern auslesen müsstest etc.
 
Och, das Installationsproblem hab ich grad ganz einfach gelöst:
Ich packe alle Dateien in ein Verzeichnis, und verschiebe sie nach erfolgter Installation in ein anderes. Somit beiben nur noch die in dem Verzeichnis, die noch installiert werden müssen.

Allerdings verzichte ich dadurch auf die Möglichkeit, z.B. in der Textdatei nachzusehen, ob bestimmte Programme vom Start ausgenommen sind. Ich hatte das ansatzweise so gemacht, dass ich in der Textdatei ein Semikolon an den Anfang der auszukommentierenden Zeilen gesetzt hatte:
Code:
FOR /F (eol=;) %%i in (test.txt) DO ......

Mich würde aber immer noch interessieren, ob man mit den normalen Shell Befehlen eine TXT Datei so manipulieren kann, dass man z.B. einzelne Zeilen daraus löschen kann, da ich die Dateiliste auch noch für andere Operationen brauchen würde. Direkt wird's nicht gehen, dazu fehlt einfach der Befehl "lösche Zeile hastdunichtgesehen aus der Datei blahblh.txt", aber man könnte ja eine temporäre Datei erstellen, wo nur noch die Sachen drin sind, die nach der "Löschung" drin sein sollen und dann die Original Datei durch die andere ersetzen.

edit:
Habs grad mit der Konstruktion umgangen:
Code:
FINDSTR /v /g:test2.txt "test.txt" > output.txt

schreibt nur die Zeilen in output.txt, die in test.txt aber nicht in test2.txt enthalten sind.
Falls noch jemandem eine elegantere Lösung einfallen sollte: Her damit :)

Au weia, das war wohl ein typischer Fall von :rtfm ... manchmal kann man aber auch wirklich vernagelt sein - ich schäm mich ja auch schon :weg
 
Zuletzt bearbeitet:
Nee nee.... Keine Fremdsoftware und erst recht kein DOS pur... Nur echte Win≥2K Befehle, ansonsten könnte man ja gleich AutoIT nehmen, damit ginge noch mehr und sogar mit Klickibunti Interfaces ;)
Muss doch gatt mal nachsehen, ob das schon in der Downloadsektion drin ist, das Progrämmchen funktioniert recht gut :)

Man könnte natürlich auch eine HTA Datei mit viel VBS drin schreiben, aber das will ich alles nicht :D
 
Erstmal herzlich willkommen im Board!

Jein, mit den c't Offline-Update kann man sich zwar die ganzen Dateien herunterladen usw, ich habe allerdings vor, die Sachen neben der automatischen Installation auch gleich in meine Software DVDs bzw. die Netzwerk Deployment Punkte zu "Slipstreamen" und das kann das c't Offline Update nicht - zumal es nur die Sicherheitsupdates herunterläd und nicht, wie ich es getan habe, auch zusätzliche Erweiterungen ;)

PS: Alternativ zum c't update kann man auch den PC-Welt Ultimate Loader und den App Updater verwenden, das ist das selbe in grün und wenn man danach sucht, findet man bestimmt noch eine Menge solcher Scripts...

edit:
Auch wenns ein wenig von hinten durch die Brust ins Auge ist, ich hab das Problem nun so gelöst:
Code:
@ECHO OFF
COLOR F0
TITLE Dateien listen

ECHO Starten
ECHO.
REM Leere temporaere Dateiliste erstellen
TYPE NUL > filetemp1.tmp
REM Verzeichnis auf EXE Dateien durchwühlen 
FOR /f %%I IN ('DIR /b *.exe') DO (
REM Nachsehen, ob die aktuelle in der filelist.txt
REM mit einem Semikolon auskommentiert ist
REM Wenn Ja: den Auskommentierten String uebernehmen
    FINDSTR "^;%%I" filelist.txt >> filetemp1.tmp
REM Wenn Nein: Dateinamen eintragen
    IF ERRORLEVEL 1 ECHO %%I >> filetemp1.tmp
)
ECHO.
REM Das Ergebnis
TYPE filetemp1.tmp
ECHO.
PAUSE
In der vollständigen Datei geht es natürlich noch ein wenig weiter, z.B. kann man die Datei editieren, danach alles installieren lassen, die filelist wird aktualisiert und die tmp Datei wird hinterher gelöscht, aber das gehörte ja alles nicht zum Ausgangsproblem :D
 
Zuletzt bearbeitet:
Oben