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
GELÖST

Batch Abfrage und Änderung einer Textdatei in einem Verzeichnis

Frage Entwicklung Batch & Shell

Mitglied: X-Spezi

X-Spezi (Level 1) - Jetzt verbinden

24.12.2010, aktualisiert 14:06 Uhr, 6484 Aufrufe, 6 Kommentare

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
Mitglied: mathe172
24.12.2010 um 15:17 Uhr
Hallo X-Spezi!

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

Mathe172
Bitte warten ..
Mitglied: X-Spezi
25.12.2010 um 13:35 Uhr
Hallo Mathe 172,

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

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
Bitte warten ..
Mitglied: bastla
25.12.2010 um 14:52 Uhr
Hallo X-Spezi!

Verwende bitte zum Posten der Beispieldaten "Code"-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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
Rem Eingabedatei 
03.
set "Eingabe=test.txt" 
04.
Rem Ausgabedatei 
05.
set "Ausgabe=Ausgabe.txt" 
06.
Rem Ausgabedatei löschen; wenn nicht vorhanden, Fehlermeldung unterdrücken 
07.
del "%Ausgabe%" 2>nul 
08.
Rem Variable, um die IP zwischenzuspeichern, initialisieren 
09.
set "IP=" 
10.
Rem Eine Schleife, die jede Zeile der Ausgangsdatei(test.txt) abarbeitet: 
11.
Rem Als Stücke werden das erste (vor) und das zweite (nach) dem Trennzeichen ";" benutzt 
12.
for /F "usebackq tokens=1,2 delims=;" %%A in ("%Eingabe%") do ( 
13.
    Rem Ersten Teil der Zeile zerlegen, um zwischen "IP"-Zeile und Daten-Zeile zu unterscheiden 
14.
    Rem und im ersten Fall die IP zu extrahieren und zwischenzuspeichern 
15.
    for /f "tokens=1,2" %%h in ("%%A") do if %%h==IP ( 
16.
        set "IP=%%i" 
17.
    ) else ( 
18.
        Rem Wenn der zweite Teil der Zeile nicht leer ist (also nicht kein Trennzeichen da ist) ... 
19.
        Rem ... und vorher eine IP gespeichert wurde ... 
20.
        if not "%%B"=="" if defined IP ( 
21.
            Rem ... diesen ersten Teil (also bis vor das ";") bearbeiten 
22.
            Rem Dafür das defaultmäßige Trennzeichen " " nehmen und die Stücke so aufteilen: 
23.
            Rem 1-3 in einzelne Variablen (entspricht: "SNMP...Descr.0","=","String:") und den Rest (entspricht dem Druckernamen) 
24.
            for /F "tokens=1-3*" %%a in ("%%A") do ( 
25.
                Rem die gewünschten Informationen in die Ausgabedatei schreiben 
26.
                >>"%Ausgabe%" echo IP !IP! %%d 
27.
                set "IP=" 
28.
29.
30.
31.
)
(In dieser Fassung bekäme dann auch "enabledelayedexpansion" Sinn ...)

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
25.12.2010 um 15:25 Uhr
Hallo X-Spezi!

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

Versuch mal das:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set Ausgabe=Ausgabe.txt 
03.
for /F "tokens=1,2 delims=;" %%A in (test.txt) do ( 
04.
if not "%%B"=="" ( 
05.
for /F "tokens=3*" %%a in ("%%A") do ( 
06.
echo.IP !IP! %%b>>%Ausgabe% 
07.
08.
09.
for /F "tokens=2" %%a in ("%%A") do set "IP=%%a" 
10.
11.
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]
Bitte warten ..
Mitglied: 76109
25.12.2010 um 17:57 Uhr
Hallo X-Spezi!

Eventuell tut's auch ein VB-Script (*.vbs):
01.
    Const iPath = "E:\Test\Import.txt" 
02.
    Const ePath = "E:\Test\Export.txt" 
03.
 
04.
    Dim Re, Fso, File, Text 
05.
 
06.
    Set Re = New RegExp 
07.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
08.
     
09.
    Set File = Fso.OpenTextFile(iPath) 
10.
     
11.
    Text = File.ReadAll:  File.Close 
12.
     
13.
    Set File = Fso.CreateTextFile(ePath) 
14.
     
15.
    With Re 
16.
       .Global = True 
17.
       .IgnoreCase = True 
18.
       .Pattern = "(IP [^S^\r]*)[^=]*= STRING: ([^;^\r]*);" 
19.
    End With 
20.
                                                           
21.
    For Each Token In Re.Execute(Text) 
22.
        With Token.Submatches 
23.
            If .Count = 2 Then File.WriteLine .Item(0) & .Item(1) 
24.
        End With 
25.
    Next 
26.
     
27.
    File.Close
Pfad-Konstanten entsprechend anpassen.

Gruß Dieter
Bitte warten ..
Mitglied: X-Spezi
26.12.2010 um 14:15 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch: Öffnen einer Textdatei nach Systemneustart (17)

Frage von sascha382 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...