x-spezi
Goto Top

Batch Abfrage und Änderung einer Textdatei in einem Verzeichnis

Hallo an alle Forum-Mitglieder! Ich bin auf Euere Hilfe angewiesen, ich habe mit einer Batch-Programmierung Probleme. Auch bei Google konnte ich nicht das Richtige finden.

"Per Batch Abfrage und Änderung einer Textdatei in einem Verzeichnis "

Ich habe folgendes Problem: Wir fragen mit SNMP alle Drucker im Netzt ab .
Allerdings antwortet auch andere Hardware wie PC´s
Das Ergebnis der Abfrage ist in einer Txt Datei gespeichert, allerdings ziemlich unübersichtlich.
Darum möchte ich diese Datei über einen Batch etwas anpassen.

1. In einer Zeile nach einem Text oder Zeichen suchen und dann den Rest löschen, oder
2. Wenn es diesen Text oder Zeichen NICHT gibt, dann die Zeile löschen

Beispiel : Drucker - Abfrage über SNMP

Bei Erfolgreicher Antwort:

Von PC
IP 192.168.1.100 SNMPv2-MIB::sysDescr.0 = STRING: Hardware: x86 Family 6 Model 9 Stepping 5 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)


Von Drucker:
IP 192.168.1.101 SNMPv2-MIB::sysDescr.0 = STRING: HP 5SI; System Software Version 4711.000, Main Controller 0.03.40, Network Controller 1.30, Image Output Terminal 01.24, User Interface 0.045.15.0, DADF 11, Tray2 1.01.

IP 192.168.1.102 SNMPv2-MIB::sysDescr.0 = STRING: Epson T-750; System Software Version 4812.000, Main Controller 0.03.40, Network Controller 1.30, Image Output Terminal 01.24, User Interface 0.045.15.0, DADF 13, Tray2 1.01.


Bei negativer Antwort
IP 192.168.1.103
IP 192.168.1.104


Das Ergebnis sollte dann so Aussehen.

IP 192.168.1.101 HP 5SI
IP 192.168.1.102 Epson T-750


Ich habe mir folgendes Vorgestellt:

1. Durchgang: Wenn im Text KEIN Semikolon (nach Druckermodell) erscheint, dann die Zeile löschen
2. Durchgang: Wenn im Text ein Semikolon (nach Druckermodell) erscheint, dann den Rest löschen.
3. Durchgang : Text von SNMP bis String: löschen
4. Das Ergebnis in einer neuen Datei speichern.

Kann mir dabei jemand helfen? Danke!

x-spezi

Content-ID: 157537

Url: https://administrator.de/forum/batch-abfrage-und-aenderung-einer-textdatei-in-einem-verzeichnis-157537.html

Ausgedruckt am: 23.12.2024 um 08:12 Uhr

mathe172
mathe172 24.12.2010 um 15:17:57 Uhr
Goto Top
Hallo X-Spezi!

Versuch mal diesen Code hier: (Ist so ziemlich nach deiner Idee)
@echo off & setlocal enabledelayedexpansion
Rem Ausgabedatei
set "Ausgabe=Ausgabe.txt"  
Rem Ausgabedatei löschen, wenn vorhanden
If exist %Ausgabe% del %Ausgabe%
Rem Eine Schleife die jede Zeile der Ausgangsdatei(test.txt) abarbeitet
Rem Als Stücke werden das erste (vor) und das zweite (nach) dem Trennzeichen ";" benutzt  
for /F "tokens=1,2 delims=;" %%A in (test.txt) do (  
Rem Wenn der zweite nicht leer ist (also nicht kein Trennzeichen da ist)...
if not "%%B"=="" (  
Rem ...Den ersten Teil (also bis vor das ";") bearbeiten  
Rem Dafür das Trennzeichen " " nehmen und die Stücke so aufteilen:  
Rem 1-5 in einzellne Variablen (entspricht: "IP","192.168...","SNMP...Descr.0","=","String:") und den Rest (entspricht dem Druckernamen) in eine andere  
for /F "tokens=1-5*" %%a in ("%%A") do (  
Rem die gewünschten in die Ausgabedatei schreiben
echo.%%a %%b %%f>>%Ausgabe%
)
)
)
pause
Das ganze funktioniert aber nur, wenn der zu löschende Teil (SNMP...String: ) immer aus drei Teilen besteht

Mathe172
X-Spezi
X-Spezi 25.12.2010 um 13:35:46 Uhr
Goto Top
Hallo Mathe 172,

danke für die schnelle Antwort.
Das ist schon fast perfekt face-wink)

Aber in dem Ergebnis fehlt die IP Nummer und der kpl. Druckername.

Ausgabe von dem Batch:

SNMPv2-MIB::sysDescr.0 =
SNMPv2-MIB::sysDescr.0 =
SNMPv2-MIB::sysDescr.0 = II NT v47.0
SNMPv2-MIB::sysDescr.0 =
SNMPv2-MIB::sysDescr.0 =
SNMPv2-MIB::sysDescr.0 = 15
SNMPv2-MIB::sysDescr.0 =
SNMPv2-MIB::sysDescr.0 = PageMaster 1025
SNMPv2-MIB::sysDescr.0 =

Sollte sein

IP 192.168.1.233 HP5 SI
IP 192.168.1.236 Epson T-750
IP 192.168.1.240 Apple LaserWriter II NT v47.0
…………

Ich glaube bei der Suche nach Trennzeichen entsteht der Fehler


Die Abfrageliste ist:

Suche gestartet um 10:12:51,76 am 23.12.2010

IP 192.168.1.200

IP 192.168.1.201

IP 192.168.1.202

IP 192.168.1.203

IP 192.168.1.204

IP 192.168.1.205

IP 192.168.1.206

IP 192.168.1.207

IP 192.168.1.208

IP 192.168.1.209

IP 192.168.1.210

IP 192.168.1.211

IP 192.168.1.212

IP 192.168.1.213

IP 192.168.1.214

IP 192.168.1.215

IP 192.168.1.216

IP 192.168.1.217
SNMPv2-MIB::sysDescr.0 = STRING: Hardware: x86 Family 6 Model 8 Stepping 1 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)

IP 192.168.1.218

IP 192.168.1.219

IP 192.168.1.220

IP 192.168.1.221

IP 192.168.1.222

IP 192.168.1.223

IP 192.168.1.224

IP 192.168.1.225

IP 192.168.1.226

IP 192.168.1.227

IP 192.168.1.228

IP 192.168.1.229

IP 192.168.1.230

IP 192.168.1.231

IP 192.168.1.232

IP 192.168.1.233
SNMPv2-MIB::sysDescr.0 = STRING: HP5 SI;PS 4.2.0,Net 25.72.10.07.2005,Eng 0.11.2,OS 6.26

IP 192.168.1.234
SNMPv2-MIB::sysDescr.0 = STRING: Hardware: x86 Family 6 Model 9 Stepping 5 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)

IP 192.168.1.235

IP 192.168.1.236
SNMPv2-MIB::sysDescr.0 = STRING: Epson T-750; OS 8.38, PS 5.1.6, Eng 12.11.0, Net 41.78.11.09.2010, Adobe PostScript 3016.101 (10), PCL 5c Version 5.0

IP 192.168.1.237

IP 192.168.1.238

IP 192.168.1.239

IP 192.168.1.240
SNMPv2-MIB::sysDescr.0 = STRING: Apple LaserWriter II NT v47.0; System Software Version 15.003.40.000, Main Controller 2.50.03.40, Network Controller 4.01.30, Image Output Terminal 0.01.24, User Interface 0.045.15.030, DADF 1.01, Tray2 1.01.04

IP 192.168.1.241
SNMPv2-MIB::sysDescr.0 = STRING: Canon LBP-3260; OS 1.70.02.63 _SMP1R1, NIC V4.01.16(P3435 SMP1R1) 07-16-2009, Engine 1.00.60, Tray2 3.00.01, Duplex 0.00.00 , PCL6 5.93 03-21-2009, PS3 V1.94.06 12-22-2008

IP 192.168.1.242
SNMPv2-MIB::sysDescr.0 = STRING: Brother HJ-100; ESS 0.R01.08.354.01, IOT 23.55.0, UI 0.2.98.52, Finisher 9.30.0, Scanner 15.7.0

IP 192.168.1.243

IP 192.168.1.244
SNMPv2-MIB::sysDescr.0 = STRING: Compaq PageMarq 15; System 1.3.7.P, OS 8.13, PS 5.1.3, Eng 11.58.00, Net 41.75.10.18.2010, Adobe PostScript 3016.101 (14), PCL 5e/6 Version 7.0.1, Finisher 4.02.00

IP 192.168.1.245

IP 192.168.1.246
SNMPv2-MIB::sysDescr.0 = STRING: Citizen 120D; System 1.3.8.P, OS 10.24, PS 4.1.0, Eng 23.P1.4.1.0, Net 42.02.07.19.2010, Adobe PostScript 3016.101 (16), PCL 5c Version 5.0

IP 192.168.1.247
SNMPv2-MIB::sysDescr.0 = STRING: Bull Compuprint PageMaster 1025; System Software 10.100.71.000, Main Controller 1.01.07.10, Network Controller 2.01.71.02, IOT 1.00.28, UI 0.030.33.007, Document Feeder 1.02, Tray2 1.00.00, Finisher 3.06.05, IH 0.00.01

IP 192.168.1.248

IP 192.168.1.249

IP 192.168.1.250

IP 192.168.1.251

IP 192.168.1.252

IP 192.168.1.253

IP 192.168.1.254

IP 192.168.1.255
SNMPv2-MIB::sysDescr.0 = STRING: Brother HJ-100;PS 4.2.0,Net 25.72.10.07.2005,Eng 0.11.2,OS 6.26


Könntest Du mir hier noch einmal helfen ?

Vielen Dank und auch noch ein frohes Weihnachtsfest

Von X-Spezi
bastla
bastla 25.12.2010 um 14:52:05 Uhr
Goto Top
Hallo X-Spezi!

Verwende bitte zum Posten der Beispieldaten ""-Formatierung - dann ist (hoffentlich) auch eindeutig zu erkennen, ob/dass es (im Unterschied zu Deiner Beschreibung oben) zwischen der IP und der "SNMP..."-Ausgabe einen Zeilenumbruch gibt, was zu einer veränderten Logik im Batch führen würde, nämlich etwa so:
@echo off & setlocal enabledelayedexpansion
Rem Eingabedatei
set "Eingabe=test.txt"  
Rem Ausgabedatei
set "Ausgabe=Ausgabe.txt"  
Rem Ausgabedatei löschen; wenn nicht vorhanden, Fehlermeldung unterdrücken
del "%Ausgabe%" 2>nul  
Rem Variable, um die IP zwischenzuspeichern, initialisieren
set "IP="  
Rem Eine Schleife, die jede Zeile der Ausgangsdatei(test.txt) abarbeitet:
Rem Als Stücke werden das erste (vor) und das zweite (nach) dem Trennzeichen ";" benutzt  
for /F "usebackq tokens=1,2 delims=;" %%A in ("%Eingabe%") do (  
    Rem Ersten Teil der Zeile zerlegen, um zwischen "IP"-Zeile und Daten-Zeile zu unterscheiden  
    Rem und im ersten Fall die IP zu extrahieren und zwischenzuspeichern
    for /f "tokens=1,2" %%h in ("%%A") do if %%h==IP (  
        set "IP=%%i"  
    ) else (
        Rem Wenn der zweite Teil der Zeile nicht leer ist (also nicht kein Trennzeichen da ist) ...
        Rem ... und vorher eine IP gespeichert wurde ...
        if not "%%B"=="" if defined IP (  
            Rem ... diesen ersten Teil (also bis vor das ";") bearbeiten  
            Rem Dafür das defaultmäßige Trennzeichen " " nehmen und die Stücke so aufteilen:  
            Rem 1-3 in einzelne Variablen (entspricht: "SNMP...Descr.0","=","String:") und den Rest (entspricht dem Druckernamen)  
            for /F "tokens=1-3*" %%a in ("%%A") do (  
                Rem die gewünschten Informationen in die Ausgabedatei schreiben
                >>"%Ausgabe%" echo IP !IP! %%d  
                set "IP="  
            )
        )
    )
)
(In dieser Fassung bekäme dann auch "enabledelayedexpansion" Sinn ...)

Grüße
bastla
mathe172
mathe172 25.12.2010 um 15:25:37 Uhr
Goto Top
Hallo X-Spezi!

Da in deinem ersten Beispiel kein Zeilenumbruch nach den IPs war, habe ich dir einen "falschen" Code gegeben.

Versuch mal das:
@echo off & setlocal enabledelayedexpansion
set Ausgabe=Ausgabe.txt
for /F "tokens=1,2 delims=;" %%A in (test.txt) do (  
if not "%%B"=="" (  
for /F "tokens=3*" %%a in ("%%A") do (  
echo.IP !IP! %%b>>%Ausgabe%
)
)
for /F "tokens=2" %%a in ("%%A") do set "IP=%%a"  
)
pause
Dieser Code immer den 2. Token einer Zeile. Dann überprüft er, ob ein ";" vorhanden ist, wenn ja, nimmt er den Druckernamen und die IP der letzten Zeile als Ausgabe.

Mathe172
[Edit: hab grad gesehen das Bastla einen Code eingefügt hat]
76109
76109 25.12.2010 um 17:57:43 Uhr
Goto Top
Hallo X-Spezi!

Eventuell tut's auch ein VB-Script (*.vbs):
    Const iPath = "E:\Test\Import.txt"  
    Const ePath = "E:\Test\Export.txt"  

    Dim Re, Fso, File, Text

    Set Re = New RegExp
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Set File = Fso.OpenTextFile(iPath)
    
    Text = File.ReadAll:  File.Close
    
    Set File = Fso.CreateTextFile(ePath)
    
    With Re
       .Global = True
       .IgnoreCase = True
       .Pattern = "(IP [^S^\r]*)[^=]*= STRING: ([^;^\r]*);"  
    End With
                                                          
    For Each Token In Re.Execute(Text)
        With Token.Submatches
            If .Count = 2 Then File.WriteLine .Item(0) & .Item(1)
        End With
    Next
    
    File.Close
Pfad-Konstanten entsprechend anpassen.

Gruß Dieter
X-Spezi
X-Spezi 26.12.2010 um 14:15:31 Uhr
Goto Top
Hallo Mathe 172, hallo bastla,

Danke für eure Hilfe, es ist genau die Ausgabe die ich brauche.

@ Dieter, auch Dir einen schönen Dank.


Viele Grüße

x-spezi