topatsch
Goto Top

String aus Datei von jedem Client auslesen und mit Hostname in Datei schreiben String steht nicht immer an exakt selber Stelle.

Hallo,

ich stehe vor folgendem Problem, dass ich mit Hilfe der bereits bestehenden Beiträge nicht selbständig lösen konnte, daher mein Hilferuf.

Folgendes Szenario:
Server Client Infrastruktur mit einer aus lizenztechnischer Sicht schlecht administrierbaren Software. Alle Clients sind mit Winsows XP SP3 ausgestattet, die Server mit 2003 R2.
Die Konfigurationsdatei mit dem enthaltenen Lizenzschlüssel, liegt unter folgendem Verzeichnis:
c:\pragrammname\unterordner\konfig.cfg

Hier ein Auszug aus dieser Datei
‚     y  Ž      ;šÊ       Ž     Y   Y   Y     Y    ‚         ?      ;šÊ        ?ilt- à d ÿÿ !à d ÿÿ !à     à 
d 2 Çà d 2 ab und an Rechnernameà d 2 
Firmennameà  d 2 XXXXXXXX XXXXXX XXXXXXà »d   Žþ­‚

Der gesuchte String steht an der Stelle mit den X-en (öffnet man die Datei mit dem Editor steht alles in einer Zeile). Die ersten acht Zeichen sind immer gleich, darauf folgen dann sechs Ziffern und ein mal fünf Ziffern, also insgesamt 11 gesuchte Ziffern. Die Abfolge ist meistens mit einem Blank getrennt, allerdings nicht jedes mal - mit Blank wären es also 12. Beendet wird die Zeichenfolge immer mit "à".

Mein Ziel ist es jetzt den variablen Teil des Strings, inclusive der Rechnernamen untereinander in eine Textdatei auf einem Netzwerkshare zu schreiben.
Also in folgendem Format:
Rechnername XXXXXX XXXXX
Rechnername XXXXXX XXXXX
...

Ich hoffe Ihr könnt mir helfen, vielen Dank im Voraus!!

Grüße
topatsch

Content-Key: 119603

Url: https://administrator.de/contentid/119603

Printed on: April 23, 2024 at 19:04 o'clock

Mitglied: 77559
77559 Jul 02, 2009 at 11:55:24 (UTC)
Goto Top
Hallo topatsch,

es handelt sich wohl um eine Binärdatei, entweder kannst du mit festen Offsets lesen (z.Bsp. mit vbscript) oder du kannst mit einem Tool wie Strings von Sysinternals alle Textelemente ab einer bestimmten Textlänge und nach dem fixen Anfang filtern. Den Rechnernamen kennst du ja.

Ein grober Entwurf:
@echo off
Set PCs=C:\RechnerListe.txt
Set File=C$\pragrammname\unterordner\konfig.cfg
Set Ausgabe=C:\Test.txt
set Pref=xxxxxxxx
Echo ## %Date% %Time% >%Ausgabe%
For /f "delims=" %%A in (%PCs%) Do (  
  >>%Ausgabe% set /P dummy=%%A <NUL
  if exist "\\%%A\%File" (  
    Strings -n 20 "\\%%A\%File" |findstr "^%Pref%" >>%Ausgabe%   
  ) else (
    >>%Ausgabe% echo konfig.cfg nicht gefunden
  )
)

Gruß
LotPings

Edit: Ausgabe in Datei, Ausgabe hinter Findstr
Member: bastla
bastla Jul 02, 2009 at 12:44:06 (UTC)
Goto Top
Hallo topatsch und willkommen im Forum!

Die von LotPings angesprochene VBScript-Lösung könnte so aussehen:
Konfig = "c:\programmname\unterordner\konfig.cfg"  
Sammel = "\\Server\Share\Lizenzen.txt"  
Von = "XXXXXXXX"  
Bis = "à"  
MaxLen = 12 'max. Schlüssellänge inkl Leerzeichen  

Set net = CreateObject("WScript.Network")  
Set fso = CreateObject("Scripting.FileSystemObject")  
If fso.FileExists(Konfig) Then
    T = Split(fso.OpenTextFile(Konfig).ReadAll, Von)
    If Ubound(T) > 0 Then 'Kennzeichen "Von" gefunden  
        K = Split(T(1), Bis)
        If Len(Trim(K(0))) <= MaxLen Then 'Länge des ausgelesenen Schlüssels kann passen  
            C = net.Computername & " " 'Computername + Trennzeichen  
            Neu = True
            If fso.FileExists(Sammel) Then
                L = fso.OpenTextFile(Sammel, 1, True).ReadAll
                If Instr(L, C) > 0 Then Neu = False'bereits erfasst  
            End If
            If Neu Then
                fso.OpenTextFile(Sammel, 8, True).WriteLine C & Trim(K(0)) 'Rechnername + Schlüssel in Datei schreiben  
            End If
        End If
    End If
End If
Gestartet werden soll das Script lokal auf jedem Rechner (zB als "Starten"- oder "Logon"-Script) - da vorweg kontrolliert wird, ob der Schlüsses dieses Rechners bereits gespeichert ist, kann es auch mehrmals ausgeführt werden.

Falls keine "konfig.cfg" bzw keine dem vorgegebenen Schema entsprechenden Daten gefunden werden, erfolgt kein Eintrag (Fehlermeldungen ließen sich aber bei Bedarf ergänzen).

Zu beachten wäre noch, dass für die Werte von Von und Bis Groß-/Kleinschreibung unterschieden wird.

Grüße
bastla
Member: topatsch
topatsch Jul 02, 2009 at 13:05:45 (UTC)
Goto Top
Okay, das bedeutet also, dass ich nicht drum herum komme eine Textdatei mit allen Rechnernamen anzulegen?
Ich habe deinen groben Entwurf mal getestet

Mit Strings funktioniert das schon echt gut und wenn ich die Ausgabe in commandline laufen lasse, bekomme ich auch alles schön untereinander aufgelistet. Aber wie kann man jetzt noch realisieren, die Ausgaben in eine Datei fließen zu lassen? Wenn ich hinter den Strings Befehl die Ausgabe in > test.txt lasse, wird mir ja nur der jeweils letzte Rechner bzw nur der ausgelesene String in die Datei geschrieben. Sorry, bin ein echter Batch Anfänger face-wink
Mitglied: 77559
77559 Jul 02, 2009 at 13:15:18 (UTC)
Goto Top
Hallo Topatsch,

das geht per append mit doppeltem Umleitungszeichen >>
Ich bau das mal oben ein.

Gruß
LotPings
Member: topatsch
topatsch Jul 02, 2009 at 13:49:59 (UTC)
Goto Top
Da kann ich jetzt nur ein "WOW!!" von mir geben, ich werde mich gleich mal an's testen wagen, auch wenn ich von vbs noch weniger Ahnung als von Batch habe face-wink
Member: topatsch
topatsch Jul 02, 2009 at 14:22:41 (UTC)
Goto Top
Ich zweifel gerade "etwas" an meinem Verstand. Passe ich das Script an und führe es lokal auf dem Rechner zum testen aus, werden keine Einträge gemacht.
Groß- kleinschreibung habe ich überprüft, passt alles. Es sollte ja keinen Unterschied machen, dass ich für "Sammel = "c:\test.txt" " gesetzt habe sollte ja keinen Unterschied machen, oder? Gibt es typische Anfängerfehler?
Member: bastla
bastla Jul 02, 2009 at 14:39:12 (UTC)
Goto Top
Hallo topatsch!

Mit der folgenden Version bekommst Du bei einem Start über die Kommandozeile mit
cscript //nologo Scriptdatei.vbs
einige Debug-Informationen:
Konfig = "c:\programmname\unterordner\konfig.cfg"  
Sammel = "c:\test.txt"  
Von = "XXXXXXXX"  
Bis = "à"  
MaxLen = 12 'max. Schlüssellänge inkl Leerzeichen  

Set net = CreateObject("WScript.Network")  
Set fso = CreateObject("Scripting.FileSystemObject")  
If fso.FileExists(Konfig) Then
    WScript.Echo "Datei " & Konfig & " gefunden"  
    T = Split(fso.OpenTextFile(Konfig).ReadAll, Von)
    If Ubound(T) > 0 Then 'Kennzeichen "Von" gefunden  
        WScript.Echo "Zerlege " & T(1)  
        K = Split(T(1), Bis)
        WScript.Echo "Das sollte der Key sein: " & K(0)  
        WScript.Echo "Länge des Key: " & Len(K(0))  
        If Len(Trim(K(0))) <= MaxLen Then 'Länge des ausgelesenen Schlüssels kann passen  
            C = net.Computername & " " 'Computername + Trennzeichen  
            Neu = True
            If fso.FileExists(Sammel) Then
                WScript.Echo "Inhalt der Sammeldatei " & Sammel & " prüfen"  
                L = fso.OpenTextFile(Sammel, 1, True).ReadAll
                If Instr(L, C) > 0 Then 
                    Neu = False'bereits erfasst  
                    WScript.Echo "Sammeldatei enthält bereits einen Eintrag für den Rechner " & C  
                End If
            End If
            If Neu Then
                WScript.Echo "Schreibe Rechnername " & C & "und Key " & K(0) & " in Sammeldatei"  
                fso.OpenTextFile(Sammel, 8, True).WriteLine C & Trim(K(0)) 'Rechnername + Schlüssel in Datei schreiben  
            End If
        End If
    End If
End If
Bei mir hat das Script mit Deinen Testdaten von oben (ohne Zeilenschaltungen und mit einem "X" in der letzten Gruppe weniger face-wink) funktioniert.

Grüße
bastla
Member: topatsch
topatsch Jul 02, 2009 at 16:50:18 (UTC)
Goto Top
Okay, also mit der Hilfestellung bin ich jetzt ein Stückchen weiter gekommen.
Die Datei wird gefunden, kann aber irgendwie nicht richtig ausgelesen werden. Das komisch ist: Sobald ich den Inhalt der Datei einmal heraus kopiere und anschließend wieder mit gleichem Inhalt der Zwischenablage überschreibe kann der String ausgelesen werden.

Allerdings gibt's noch andere Problemchen face-wink
C:\>cscript //nologo vb.vbs
Datei c:\konfig.cfg gefunden
Zerlege  XXXXXX XXXXXà♥ ?»d &ang90;  Zþ?­'?        ?­   ♥    ;sÊ       ?­    ? à? s??C  
:\bla\xcomp\calendar.dlljÕ♥        ?5;?'??Calendar LibraryZB'?  
Das sollte der Key sein:  XXXXXX XXXXX
Länge des Key: 13
Inhalt der Sammeldatei c:\test.txt prüfen
C:\vb.vbs(22, 17) Laufzeitfehler in Microsoft VBScript: Eingabe hinter Dateiende
Member: bastla
bastla Jul 02, 2009 at 17:12:00 (UTC)
Goto Top
Hallo topatsch!

Der Fehler "Laufzeitfehler in Microsoft VBScript: Eingabe hinter Dateiende" resultiert vermutlich aus einer "test.txt" mit 0 Byte (von vorhergehenden Testläufen) - wenn Du diese löschst, sollte es in weiterer Folge klappen (ich ergänze das Script nachher, um den Fehler abzufangen) ...

Grüße
bastla
Member: topatsch
topatsch Jul 06, 2009 at 08:41:31 (UTC)
Goto Top
Sorry für die späte Rückmeldung - Arbeit über Arbeit... face-wink
Du hast Recht, bastla, die Fehlermeldung resultierte wirklich aus einer bereits existierenden "test.txt", lösche ich diese, funktioniert es face-smile
Allerdings habe ich immernoch das Problem, dass ich den Inhalt der "Konfig.cfg" einmal mit copy/paste bearbeiten muss, damit der Inhalt von dem Script ausgelesen werden kann.
Kannst du mir sagen, woran dies liegen könnte?

Grüße
topatsch