Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: topatsch

topatsch (Level 1) - Jetzt verbinden

02.07.2009, aktualisiert 13:19 Uhr, 4447 Aufrufe, 10 Kommentare

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
01.
‚     y  Ž      ;šÊ       Ž     Y   Y   Y     Y    ‚         ?      ;šÊ        ?ilt- à d ÿÿ !à d ÿÿ !à     à  
02.
d 2 Çà d 2 ab und an Rechnernameà d 2  
03.
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
Mitglied: LotPings
02.07.2009 um 13:55 Uhr
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:
01.
@echo off 
02.
Set PCs=C:\RechnerListe.txt 
03.
Set File=C$\pragrammname\unterordner\konfig.cfg 
04.
Set Ausgabe=C:\Test.txt 
05.
set Pref=xxxxxxxx 
06.
Echo ## %Date% %Time% >%Ausgabe% 
07.
For /f "delims=" %%A in (%PCs%) Do ( 
08.
  >>%Ausgabe% set /P dummy=%%A <NUL 
09.
  if exist "\\%%A\%File" ( 
10.
    Strings -n 20 "\\%%A\%File" |findstr "^%Pref%" >>%Ausgabe%  
11.
  ) else ( 
12.
    >>%Ausgabe% echo konfig.cfg nicht gefunden 
13.
14.
)
Gruß
LotPings

Edit: Ausgabe in Datei, Ausgabe hinter Findstr
Bitte warten ..
Mitglied: bastla
02.07.2009 um 14:44 Uhr
Hallo topatsch und willkommen im Forum!

Die von LotPings angesprochene VBScript-Lösung könnte so aussehen:
01.
Konfig = "c:\programmname\unterordner\konfig.cfg" 
02.
Sammel = "\\Server\Share\Lizenzen.txt" 
03.
Von = "XXXXXXXX" 
04.
Bis = "à" 
05.
MaxLen = 12 'max. Schlüssellänge inkl Leerzeichen 
06.
 
07.
Set net = CreateObject("WScript.Network") 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
If fso.FileExists(Konfig) Then 
10.
    T = Split(fso.OpenTextFile(Konfig).ReadAll, Von) 
11.
    If Ubound(T) > 0 Then 'Kennzeichen "Von" gefunden 
12.
        K = Split(T(1), Bis) 
13.
        If Len(Trim(K(0))) <= MaxLen Then 'Länge des ausgelesenen Schlüssels kann passen 
14.
            C = net.Computername & " " 'Computername + Trennzeichen 
15.
            Neu = True 
16.
            If fso.FileExists(Sammel) Then 
17.
                L = fso.OpenTextFile(Sammel, 1, True).ReadAll 
18.
                If Instr(L, C) > 0 Then Neu = False'bereits erfasst 
19.
            End If 
20.
            If Neu Then 
21.
                fso.OpenTextFile(Sammel, 8, True).WriteLine C & Trim(K(0)) 'Rechnername + Schlüssel in Datei schreiben 
22.
            End If 
23.
        End If 
24.
    End If 
25.
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
Bitte warten ..
Mitglied: topatsch
02.07.2009 um 15:05 Uhr
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
Bitte warten ..
Mitglied: LotPings
02.07.2009 um 15:15 Uhr
Hallo Topatsch,

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

Gruß
LotPings
Bitte warten ..
Mitglied: topatsch
02.07.2009 um 15:49 Uhr
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
Bitte warten ..
Mitglied: topatsch
02.07.2009 um 16:22 Uhr
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?
Bitte warten ..
Mitglied: bastla
02.07.2009 um 16:39 Uhr
Hallo topatsch!

Mit der folgenden Version bekommst Du bei einem Start über die Kommandozeile mit
cscript //nologo Scriptdatei.vbs
einige Debug-Informationen:
01.
Konfig = "c:\programmname\unterordner\konfig.cfg" 
02.
Sammel = "c:\test.txt" 
03.
Von = "XXXXXXXX" 
04.
Bis = "à" 
05.
MaxLen = 12 'max. Schlüssellänge inkl Leerzeichen 
06.
 
07.
Set net = CreateObject("WScript.Network") 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
If fso.FileExists(Konfig) Then 
10.
    WScript.Echo "Datei " & Konfig & " gefunden" 
11.
    T = Split(fso.OpenTextFile(Konfig).ReadAll, Von) 
12.
    If Ubound(T) > 0 Then 'Kennzeichen "Von" gefunden 
13.
        WScript.Echo "Zerlege " & T(1) 
14.
        K = Split(T(1), Bis) 
15.
        WScript.Echo "Das sollte der Key sein: " & K(0) 
16.
        WScript.Echo "Länge des Key: " & Len(K(0)) 
17.
        If Len(Trim(K(0))) <= MaxLen Then 'Länge des ausgelesenen Schlüssels kann passen 
18.
            C = net.Computername & " " 'Computername + Trennzeichen 
19.
            Neu = True 
20.
            If fso.FileExists(Sammel) Then 
21.
                WScript.Echo "Inhalt der Sammeldatei " & Sammel & " prüfen" 
22.
                L = fso.OpenTextFile(Sammel, 1, True).ReadAll 
23.
                If Instr(L, C) > 0 Then  
24.
                    Neu = False'bereits erfasst 
25.
                    WScript.Echo "Sammeldatei enthält bereits einen Eintrag für den Rechner " & C 
26.
                End If 
27.
            End If 
28.
            If Neu Then 
29.
                WScript.Echo "Schreibe Rechnername " & C & "und Key " & K(0) & " in Sammeldatei" 
30.
                fso.OpenTextFile(Sammel, 8, True).WriteLine C & Trim(K(0)) 'Rechnername + Schlüssel in Datei schreiben 
31.
            End If 
32.
        End If 
33.
    End If 
34.
End If
Bei mir hat das Script mit Deinen Testdaten von oben (ohne Zeilenschaltungen und mit einem "X" in der letzten Gruppe weniger ) funktioniert.

Grüße
bastla
Bitte warten ..
Mitglied: topatsch
02.07.2009 um 18:50 Uhr
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
01.
C:\>cscript //nologo vb.vbs 
02.
Datei c:\konfig.cfg gefunden 
03.
Zerlege  XXXXXX XXXXXà♥ ?»d &ang90;  Zþ?­'?        ?­   ♥    ;sÊ       ?­    ? à? s??C 
04.
:\bla\xcomp\calendar.dlljÕ♥        ?5;?'??Calendar LibraryZB'? 
05.
Das sollte der Key sein:  XXXXXX XXXXX 
06.
Länge des Key: 13 
07.
Inhalt der Sammeldatei c:\test.txt prüfen 
08.
C:\vb.vbs(22, 17) Laufzeitfehler in Microsoft VBScript: Eingabe hinter Dateiende
Bitte warten ..
Mitglied: bastla
02.07.2009 um 19:12 Uhr
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
Bitte warten ..
Mitglied: topatsch
06.07.2009 um 10:41 Uhr
Sorry für die späte Rückmeldung - Arbeit über Arbeit...
Du hast Recht, bastla, die Fehlermeldung resultierte wirklich aus einer bereits existierenden "test.txt", lösche ich diese, funktioniert es
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
PHP
gelöst Externe XML-Datei in PHP auslesen (18)

Frage von Akrosh zum Thema PHP ...

Batch & Shell
gelöst Aktueller Besitzer der aktuellen Datei herausfinden und in Variable schreiben (11)

Frage von Peter32 zum Thema Batch & Shell ...

Installation
gelöst Mit Powershell in einer Datei eine Zeile auslesen (6)

Frage von Bommi1961 zum Thema Installation ...

Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...