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
"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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
6 Kommentare
Neuester Kommentar
Hallo X-Spezi!
Versuch mal diesen Code hier: (Ist so ziemlich nach deiner Idee)
Das ganze funktioniert aber nur, wenn der zu löschende Teil (SNMP...String: ) immer aus drei Teilen besteht
Mathe172
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
Mathe172
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:
(In dieser Fassung bekäme dann auch "
Grüße
bastla
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="
)
)
)
)
enabledelayedexpansion
" Sinn ...)Grüße
bastla
Hallo X-Spezi!
Da in deinem ersten Beispiel kein Zeilenumbruch nach den IPs war, habe ich dir einen "falschen" Code gegeben.
Versuch mal das:
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]
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
Mathe172
[Edit: hab grad gesehen das Bastla einen Code eingefügt hat]
Hallo X-Spezi!
Eventuell tut's auch ein VB-Script (*.vbs):
Pfad-Konstanten entsprechend anpassen.
Gruß Dieter
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
Gruß Dieter