BATCH - Logfile auf änderung prüfen & eine ID auslesen?

07/08/2016 16:30 Keleg#1
Hallo,

Ich benötige eine Abfrage die überprüft ob die Datei workshop_log.txt sich verändert hat.
Falls das Logfile sich verändert hat, befinden sich im unteren Teil der Datei ein paar Einträge,
die für mich interessant sind. Die reihenfolge ist hierbei zu beachten.

[AppID 346110] Detected workshop change : changed cached item XXXXXXXXX
[AppID 346110] Finished Workshop download job : No Error

(Die X stehen für eine Mod-ID)


Falls diese Einträge gefunden wurden sollen bestimmte Ordner (ID) & Unterordner gelöscht
werden, damit eine andere Batch die ich bereits erstellt habe, die neuen Items convertieren
kann. Gleichzeitig muss diese ID für weitere Abfragen in einem Textdokument gesichert werden.

Ich habe bereits ein System in der Richtung laufen, man könnte es wohl die Beta nennen.
Allerdings ist mein altes System anfällig für störungen, dazu auch noch langsam und nicht
vollautomatisiert. Das neue System soll alle 5 Minuten checken ob ein Update für eine
Modifikation rein kam. Danach die alten konvertierten Ordner löschen. Eine neue Konvertierung
starten, das ganze verpacken und danach einem zweiten Server (Linux) das "GO" zum Download
dieser gepackten Datei geben. Dort wird sie dann entpackt und zu ihrem Anwendungsort gebracht.

Soweit habe ich alles zur Hand. Auch unter dem Linux system wurde bereits alles vorbereitet.
Nun bin ich in Windows nicht so fit und weiß deshalb nicht was ich equivalent zu tail & grep
verwenden kann.
07/08/2016 16:56 Menan#2
Sowas wäre wohl als Tool einfacher umzusetzen als als Batch-Datei.
Bzw brauchst du deine implementierung unbedingt als Batch-Datei?
07/08/2016 18:24 Keleg#3
Ich brauche für mein vorhaben nicht umbedingt Batch.
Da ich mich aber meist eher mit Administrativen problemen
herrum schlage, kann ich leider nur Shell/Bash & Batch.

Sicherlich hätte ich in anderen Sprachen auch schon längst
eine viel einfachere und bessere lösung als über tausend
Scripts und Logfiles. Aber mir fehlt das know-how. Deshalb
schlage ich mich mit workarounds und bashes & batches
durch. Das einzige was ich wirklich brauche ist die ID der
Modifikation die gerade geändert wurde, damit ich diese
einfach wieder per Cronjob aus einem Textfile auslesen kann.

Mit welcher programmierung könnte ich das denn nun noch
umsetzen ohne erst dafür Monate oder gar Jahre die Sprache
zu lernen? Ich habe bis jetzt immer alle meine Scripts unter
Linux als Bash und unter Windows als Batch geschrieben.
Ich kenne also gar nichts anderes. (Scripts schreiben)

/edit

Um das Vorhaben noch genauer zu erläutern. Es geht hier um
automatische Modupdates von ARK Servern die auf Linux laufen.
Leider gibt es keinen direkten Moddownload vom Spiel. Ich hätte
zwar die möglichkeit die Modifikationen per SteamCMD direkt auf
meinen Linux-Server zu ziehen. Allerdings müssen diese erst mit
Ionic.Zip konvertiert werden, so dass das Spiel die Modifikationen
überhaupt erst nutzen kann. Dazu kommt noch eine .mod
Datei die erstellt werden muss. Allerdings habe ich unter Linux keine
passenden hilfen und Anleitungen zur Ionic.Zip gefunden.

Ich habe dafür fertig Server scripts gefunden. Diese scheinen soetwas
per Perl zu realisieren. Allerdings möchte ich keine fertigsysteme nutzen.
Raus ziehen ging leider auch nicht so leicht, da es zu viele abhängigkeiten
gibt.

Deshalb habe ich nun den Windows VServer auf dem ich die Mods
downloade, konvertiere, verpacke und sie dann zum Linux Server schicke.
07/08/2016 20:49 .Scy#4
also du hast eine datei.
dort ändert sich was?
am einfachsten für anfänger kannst du sowas per java realisieren.
ich würde es dann so machen, dass du die datei bei programmstart ausliest, den inhalt speichern(wenn das programm weiter läuft einfach in einem string speichern). alle X sekunden die datei erneut öffnen bzw. das LastModifiedDate überprüfen, wenn es anders ist als beim ersten öffnen(du kannst auch nur das speichern, aber ka wie du dann die änderungen finden willst), dann öffnest du die datei und liest wieder alles aus.

nun weiß ich nicht was sich in der datei ändert, daher ist es auch schwer zu sagen wie du an genau diese änderung kommst, falls du nur etwas hinzufügst, kannst du einfach alles alte herauslöschen aus dem neuen string und im neuen string steht nur noch die änderung drinnen.

das ganze könnte man als anfänger innerhalb von 2-3wochen realisieren mit einer rudimentären grafikoberfläche die wirklich nur das nötigste tut. je nach vorwissen und mühe deinerseits könntest du es auch schneller fertig haben.
07/08/2016 21:33 0xFADED#5
Quote:
Originally Posted by .Scy View Post
also du hast eine datei.
am einfachsten für anfänger kannst du sowas per java realisieren.
ich würde es dann so machen, dass du die datei bei programmstart ausliest, den inhalt speichern(wenn das programm weiter läuft einfach in einem string speichern).
Bitte nicht!
Das geht doch viel einfacher mit wenigen Zeilen PowerShell :(

Code:
Function Register-Watcher {
    param ($folder)

    $filter = "*.*"

    $watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{ 
        IncludeSubdirectories = $false
        EnableRaisingEvents = $true
    }

    $changeAction = [scriptblock]::Create('
        # Schreib hier den Code den er ausführen soll wenn sich was ändert
        # Das hier ist ein beispiel um an den namen der geänderten Datei zu kommen
        $path = $Event.SourceEventArgs.FullPath
        $name = $Event.SourceEventArgs.Name
        $changeType = $Event.SourceEventArgs.ChangeType
        $timeStamp = $Event.TimeGenerated
        Write-Host "The file $name was $changeType at $timeStamp"
    ')

    Register-ObjectEvent $Watcher "Changed" -Action $changeAction
}

Register-Watcher "c:\temp" #Pfad anpassen
07/08/2016 22:15 Shawak#6
@[Only registered and activated users can see links. Click Here To Register...] hat ihm doch lediglich eine mögliche Lösung vorgeschlagen und einen Teil des Codes implementiert welcher Keleg offenbar schwer gefallen ist. Ich glaube nicht wirklich, dass er dir damit "auf den Sack gehen" wollte, vielleicht solltest du mal an deiner Ausdrucksweise arbeiten @[Only registered and activated users can see links. Click Here To Register...].

@[Only registered and activated users can see links. Click Here To Register...] du solltest deine Frage eventuell spezifizieren, solltest du eine Komplettlösung suchen schlage ich vor dich im Coders Trading umzuschauen oder bei der Dev-Suche im Sticky.
07/08/2016 22:53 Keleg#7
Danke für eure Antworten
Eigentlich dachte ich, ich könnte das alles in Batch realisieren also dachte ich an ein paar Befehle oder Zeilen die mich weiter bringen. Unter Linux würde ich tail & grep nutzen. Was mache ich im Batch?

PowerShell - Ist dann wieder was ganz anderes oder? :(
07/08/2016 23:22 EngelEatos#8
Quote:
Unter Linux würde ich tail & grep nutzen. Was mache ich im Batch?
das Equivalent zu grep würde bei Windows Findstr sein ([Only registered and activated users can see links. Click Here To Register...])
Zu tail gibt es meines Wissens kein Windows-Equivalent, wenn es dass ist, worauf du hinaus wolltest.

Evtl. solltes du einmal einen Blick auf GNU utilities für Windows werfen.
[Only registered and activated users can see links. Click Here To Register...]

Zu PowerShell:
Quote:
Die Windows PowerShell (powershell.exe), zeitweise auch bekannt unter den Codenamen Monad und Microsoft Command Shell (MSH), ist ein Kommandozeileninterpreter von Microsoft. Es ist eine Alternative zum Windows-Kommandozeilenprogramm cmd.exe und zum Windows Script Host.
Denke PowerShell wäre ebenfalls eine gute Lösung für dein Problem. (siehe Post von [Only registered and activated users can see links. Click Here To Register...])
07/08/2016 23:59 0xFADED#9
Quote:
Originally Posted by Keleg View Post
PowerShell - Ist dann wieder was ganz anderes oder? :(
PowerShell ist sozusagen eine "erweiterte Version" von Batch und auf jedem aktuellen Windows vorinstalliert.
PS ist deutlich mächtiger als Batch und hat eine modernere Syntax.
Ich dachte mir ich schlag das vor weil du ja weiter oben meintest, dass Batch nicht zwingend nötig ist.

Quote:
Originally Posted by Keleg View Post
Eigentlich dachte ich, ich könnte das alles in Batch realisieren also dachte ich an ein paar Befehle oder Zeilen die mich weiter bringen
Theoretisch ist es möglich aber nicht so schön :D
Es gibt ein Beispiel bei [Only registered and activated users can see links. Click Here To Register...]
Wenn dir Batch besser gefällt wäre das vllt. was für dich.

Quote:
Originally Posted by Keleg View Post
Unter Linux würde ich tail & grep nutzen
Falls du das Skript auf Linux porten willst kann ich dir [Only registered and activated users can see links. Click Here To Register...] empfehlen.

Code:
#!/usr/bin/env bash
while inotifywait -e modify; do
   # irgendwas
done
LG :D
07/09/2016 01:09 Keleg#10
Hat jemmand eine Idee was es mich kosten würde wenn mir jemand ein Mod konvert script für Linux schreibt?
Es benötigt dazu Ionic.Zip und die .mod Dateien müssen aus der Modifikation herraus konvertiert werden. Dazu wäre es nice, wenn es immer automatisch überprüfen würde ob ein Modupdate verfügbar ist. Natürlich soll auch immer nur nach einem Update etwas geschehen und das möglichst schnell. :)

Sowas gibt es hier:
[Only registered and activated users can see links. Click Here To Register...]

Es müsste wohl in [Only registered and activated users can see links. Click Here To Register...] liegen.
07/10/2016 09:56 0xFADED#11
Quote:
Originally Posted by Keleg View Post
Es benötigt dazu Ionic.Zip und die .mod Dateien müssen aus der Modifikation herraus konvertiert werden.
Dazu wäre es nice, wenn es immer automatisch überprüfen würde ob ein Modupdate verfügbar ist.
Natürlich soll auch immer nur nach einem Update etwas geschehen und das möglichst schnell. :)
Ich würde dir gerne helfen aber ich verstehe die Aufgabe nicht so ganz...
Soll man auf Änderungen an der "Ionic.zip" warten und die dann entpacken oder wie? :confused:
07/10/2016 11:21 Keleg#12
Also der Ursprung des ganzen:
Ich brauche ein Script, dass mir per [Only registered and activated users can see links. Click Here To Register...] Modifikationen für das Spiel [Only registered and activated users can see links. Click Here To Register...] (AppID: 346110) herrunter läd. Bis hier hin kann ich das selber erstellen.
Normalerweise würde man das Spiel ARK starten und es die Modifikationen konvertieren lassen. Denn sie werden nicht von Steam oder SteamCMD konvertiert. Man hat dann eine Linux & eine Windows version zur auswahl, außerdem muss eine .mod Datei rekonstruiert werden. (Die rekonstruktion des Linux ordners führt wohl oft zu Problemen, also immer Windows - auch für einen Linux Server.)
Da es sich hier bei aber um einen Dedicated Server, dessen SSD begrenzt ist handelt und der dazu auch noch auf Linux läuft, kommt es nicht in Frage dort Wine und das Spiel laufen zu lassen. (Die Mods für den Server AppID: 376030 kommen also vom Spiel und müssen dann normalerweise hoch geladen werden.) Zur Zeit passiert das über meinen Windows VServer, den ich aber eigentlich anderweitig benötige.

Nun gibt es für WINDOWS einige Konverter Tools, eines davon nutze ich gerade auf meinem VServer. Es nutzt Ionic.Zip(dll).
Aber soweit ich weiß ist das in dem -> [Only registered and activated users can see links. Click Here To Register...] <- für Linux, dass ich gelinkt habe nicht aufgeführt. Ich glaube dort läuft alles per Bash & Perl. <-- Ich habe bereits nach geschaut ob ich mir nicht die passenden Zeilen einfach kopieren kann. Aber da fehlen abhängigkeiten.

/edit

Also ich brauch entweder ein tolles Script dass mir die mods direkt auf dem linux dedi abfragt & updated oder eben das workaround: ein script für windows, dass bei veränderung löscht, das konvert tool anschmeißt & eine ausgabe in ein textdokument stellt. Das JA für den linux server zu re download einer modifikation. :)

Was kostet mich das Script für Linux, dass direkt abfragt, läd & konvertiert? Es wäre nämlich auch toll wenn die Modupdates zeitnah stattfinden könnten. :D