souley
Goto Top

Batch - Bestimmte Zeile(n) aus Textdatei auch bei Mehrfachvorkommen in Variable übertragen

Hallo mitsammen,
Ich bin neu im Forum und habe ganz wenig batch-Kenntnisse.
Ich möchte aus der Datei nodeinfo.txt
alle (oder zumindest die 1.) Zeilen die "DESCRIPTION"
und NICHT "INTERFACE DESCRIPTION" enthalten
in Variablen schreiben.

Die Zeilen die so in dieser Datei vorkommen:

H:\>find "DESCRIPTION" C:\NNM_TEMP\Mail\nodeinfo.txt

C:\NNM_TEMP\MAIL\NODEINFO.TXT
DESCRIPTION: Cisco Internetwork Operating System Software
DESCRIPTION: IOS (tm) C2950 Software (C2950-I6Q4L2-M), Version 12.1(22)EA2, RELEASE SOFTWARE (fc1)
DESCRIPTION: Copyright (c) 1986-2004 by cisco Systems, Inc.
DESCRIPTION: Compiled Sun 07-Nov-04 23:14 by antonino
INTERFACE DESCRIPTION: Vlan999
INTERFACE DESCRIPTION: FastEthernet0/1
INTERFACE DESCRIPTION: FastEthernet0/2
INTERFACE DESCRIPTION: FastEthernet0/3
INTERFACE DESCRIPTION: FastEthernet0/4
INTERFACE DESCRIPTION: FastEthernet0/5
INTERFACE DESCRIPTION: FastEthernet0/6.........

Ich habe folgendes probiert:

FOR /F "delims=xxx" %%B IN ('FIND "DESCRIPTION:" "C:\NNM_TEMP\Mail\nodeinfo.txt"') DO SET VAR_Description=%%B

Das bringt mir immer das LETZTE Vorkommen einer Zeile mit "DESCRITPION" (also INTERFACE DESCRIPTION: ....) zurück.
Ich möchte aber, dass zumindest das ERSTE Vorkommen einer Zeile mit "DESCRITPION" zurück.

Gibt es da eine Möglichkeit bei FOR oder FIND ?
(Habe mich auch ein wenig mit dem FOR Attribut "skip" beschäftigt, mache da aber wohl was falsch.)

Oder was kann ich probieren ?

Vielen Dank im Voraus für eine Info


souley

Content-Key: 92314

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

Printed on: April 20, 2024 at 04:04 o'clock

Mitglied: 60730
60730 Jul 17, 2008 at 15:59:10 (UTC)
Goto Top
Servus und willkommen im Club,

rem alle Interface Description raus und rest ab in .tmp
findstr /v "INTERFACE DESCRIPTION" >C:\NNM_TEMP\MAIL\NODEINFO.TXT > C:\NNM_TEMP\MAIL\NODEINFO.TMP  
rem wenn jetzt noch Description gefunden wird - ausgeben in .ini
findstr "DESCRIPTION" C:\NNM_TEMP\Mail\nodeinfo.tmp > C:\NNM_TEMP\Mail\nodeinfo.ini  

Gruß
Member: miniversum
miniversum Jul 17, 2008 at 16:37:46 (UTC)
Goto Top
Versuchs mal damit (ungetestet)
SET "VAR_Description="  
FOR /F "delims=" %%B IN ('FIND /v "INTERFACE DESCRIPTION:" "C:\NNM_TEMP\Mail\nodeinfo.txt"^|FIND "DESCRIPTION:"') DO if not defined VAR_Description SET VAR_Description=%%B  
Mitglied: 60730
60730 Jul 17, 2008 at 17:00:41 (UTC)
Goto Top
Servus Miniversum,

was ich nicht verstehe und daher den Teil mit Set weggelassen habe - damit setzt du doch die Variable immer neu - ergo - bleibt nur die Letzte "Änderung" gespeichert. (Die wird ja "zwischendurch" nicht verarbietet - geht also verloren)

Gruß

Edit:
(Vermerk an den Blindfuchs höchstselbst) - Deine Brille taugt auch nichts mehr face-wink
Member: miniversum
miniversum Jul 17, 2008 at 17:14:29 (UTC)
Goto Top
Das stimmt wenn der hintere teil der For so lauten würde:
 ... do SET VAR_Description=%%B
ich habe es aber so geschrieben:
 ... do if not defined VAR_Description SET VAR_Description=%%B
Durch das "if not defined" wird die Variable nur gesetzt wenn sie noch nciht definiert ist. Definiert wird sie bei jeder gefundenen Stelle. Daher geschieht dies nur beim ersten Mal und daher steht nach der For-Schleife auch das erste Ergebnis in der Variabeln.
Um sicherzustellen das sie nicht, aus welchen gründen auch imemr, ncith schon vorher gesetzt ist, steht davor die zeile:
SET "VAR_Description="  
Member: souley
souley Jul 18, 2008 at 10:18:32 (UTC)
Goto Top
Hallo zusammen,

Great Job,

Dank der Variante:

SET "VAR_Description="
FOR /F "delims=" %%B IN ('FIND /v "INTERFACE DESCRIPTION:" %mail_temp_file%^|FIND "DESCRIPTION:"') DO if not defined VAR_Description SET VAR_Description=%%B

Habe nun immer die erste gefunde Description in der Variablen.

LOCATION: KBC Wien
DESCRIPTION: Cisco Systems WS-C6513
NODE VENDOR: Cisco Systems
NODE AGENT: Cisco Switch
Alarm-ID: 1234567890


Vielen Dank für die präzise und prompte Hilfe.


Es ist nur ein weiteres kleines Problem aufgetaucht:

Wenn die Batchdatei in der nodeinfo.txt (=%mail_temp_file%) KEINEN Eintrag findet,
so bekomme ich am ende in der mailausgabe statt nichts
folgendes: ---------- C:\NNM_TEMP\MAIL\NODEINFO.TXT

Also den Namen des files wo nichts mit einer bestimmten Bezeichnung gefunden wurde.


Beispiele im Batch wo manchmal kein Eintrag im tempfile zu finden ist:

FOR /F "delims=xxx" %%F IN ('FIND "NODE VENDOR:" %mail_temp_file%') DO SET VAR_Node_Vendor=%%F
FOR /F "delims=xxx" %%F IN ('FIND "NODE AGENT:" %mail_temp_file%') DO SET VAR_Node_Agent=%%F
FOR /F "delims=xxx" %%G IN ('FIND "NODE LABEL:" %mail_temp_file%') DO SET VAR_Node_Label=%%G


Mailausgabe:

LOCATION: KCC Systemraum
DESCRIPTION: ERS-8610 (4.1.2.0)
C:\NNM_TEMP\MAIL\MAILTEMP_1234567890.TXT
C:\NNM_TEMP\MAIL\MAILTEMP_1234567890.TXT
Alarm-ID: 1234567890

Habe im Batch versucht errorlevel abzufragen:


FOR /F "delims=xxx" %%F IN ('FIND "NODE VENDOR:" %mail_temp_file%') DO if %errorlevel%=0 SET VAR_Node_Vendor=%%F

Das ergibt im Mail dann:

LOCATION: KCC Systemraum
DESCRIPTION: ERS-8610 (4.1.2.0)
ECHO is off.
ECHO is off.
Alarm-ID: 1234567890

Wie kann ich wenn kein Eintrag im tempfile zu finden ist
am Ende einfach NICHTS anzeigen ???

Bitte um Info oder in welcher hilfe ich nachsehen kann.


Vielen Dank
Grüße
souley

p.s.: müsste ich jetzt dafür eine neuen Beitrag erstellen ?
Mitglied: 60730
60730 Jul 18, 2008 at 10:31:55 (UTC)
Goto Top
Servus

Habe im Batch versucht errorlevel abzufragen:
FOR /F "delims=xxx" %%F IN ('FIND "NODE VENDOR:" %mail_temp_file%') DO if %errorlevel%=0 SET VAR_Node_Vendor=%%F
Änder das mal um in:
FOR /F "delims=xxx" %%F IN ('FIND "NODE VENDOR:" %mail_temp_file%') DO if %errorlevel%==0 SET VAR_Node_Vendor=%%F

Bzw.

Also den Namen des files wo nichts mit einer bestimmten Bezeichnung gefunden wurde.
if %mail_temp_file%==%VAR_Node_Vendor% set VAR_Node_Vendor=irgendwas

Gruß
Member: souley
souley Jul 18, 2008 at 12:48:59 (UTC)
Goto Top
Servus,

Danke für die Tips

Habe es mit
%errorlevel%==0
porbiert auch kein Ergebnis.

Errorlevel abzufragen war unötig von mir.
Ich dachte wenn FIND nichts findet würde das den errorlevel auf 1 setzen.
Der Bleibt aber ohnehin auf 0.


Dein Vorschlag:

if %mail_temp_file%==%VAR_Node_Vendor% set VAR_Node_Vendor=irgendwas

hab ich probiert - auch kein Ergebnis


Ich bin verwirrt, Verstehe ich das richtig ?

WENN %das file nodeinfo.txt% == %VAR_Node_Vendor Inhalt jetzt ---------- C:\NNM_TEMP\MAIL\MAILTEMP_1234567890.TXT%
DANN SCHREIBE in die VAR_Node_Vendor=irgendwas (oder halt Leerzeichen)

Kann man ein File (enhält Viele Zeilen) mit einem Parameter vergleichen ?



Was passiert da eigentlich wenn FIND nichts findet,
warum gibt er dann die Variable des Such-Files aus ?

help find gibt da nicht gerade viel Auskunft.


Grüße
souley
Mitglied: 60730
60730 Jul 18, 2008 at 13:11:25 (UTC)
Goto Top
Servus,

Errorlevel abzufragen war unötig von mir.
Ich dachte wenn FIND nichts findet würde das den errorlevel auf 1 setzen.
Das macht er eigentlich auch

Kann man ein File (enhält Viele Zeilen) mit einem Parameter vergleichen ?
Nein, das wollte ich ja auch nicht bezwecken, wenn Wert der Variablen (die den Filenamen als Inhalt hat - identisch mit der anderen Variable)
DANN SCHREIBE in die VAR_Node_Vendor=irgendwas (oder halt Leerzeichen)

Kannst du mal dein ganzes Script reinstellen, irgendwo ist ein Echo (siehe "echo off" in deiner Datei) ich versteh tatsächlich nicht, was und wie..
Ps: bitte diese benutzen.
Member: Biber
Biber Jul 18, 2008 at 16:19:02 (UTC)
Goto Top
Moin souley,

ohne dass ich jetzt den ganzen Beitrag mitgelesen hätte,
--> nimm FindStr.exe statt Find.exe

Grüße
Biber
Member: souley
souley Jul 22, 2008 at 09:16:06 (UTC)
Goto Top
Servus Timo,

Sorry for the delay, habe zur Zeit viel um die Ohren.

Hier einmal ein Extrakt vom script um das Problem zu veranschaulichen.
"Es soll wenn nichts gefunden wird, auch NICHTS in die Parameter übertragen werden.
Derzeit wird stattdessen automatisch der Name der Textdatei oder "Echo is on/off" in den Parameter übertragen."

Ausgabe wenn find oder findstr etwas findet=
NODE VENDOR: Cisco Systems
NODE AGENT: Cisco Switch

Ausgabe wenn find oder findstr NICHTS findet=
C:\NNM_TEMP\MAIL\NODEINFO_NO.TXT (bei FIND)
ECHO is on. (bei FINDSTR)


 
REM @echo off
echo %errorlevel%
pause

REM --------------------------------------------------------------------------------------------------
REM im File nodeinfo_YES.txt kommen Zeilen mit "Vendor" und "Agent" vor und werden korrekt an die Parameter übergeben  
REM -------------------------------------------------------------------------------------------------

FOR /F "delims=" %%F IN ('FIND "VENDOR:" C:\NNM_TEMP\Mail\nodeinfo_YES.txt') DO SET VAR_Node_Vendor=%%F  
FOR /F "delims=" %%G IN ('FINDSTR "AGENT:" C:\NNM_TEMP\Mail\nodeinfo_YES.txt') DO SET VAR_Node_Agent=%%G  

echo %VAR_Node_Vendor% > C:\NNM_TEMP\Mail\checktext.txt
echo %VAR_Node_Agent% >> C:\NNM_TEMP\Mail\checktext.txt

echo %VAR_Node_Vendor%
echo %VAR_Node_Agent%
echo %errorlevel%

pause


SET "VAR_Node_Vendor="  
SET "VAR_Node_Agent="  


REM --------------------------------------------------------------------------------------------------
REM PROBLEM:
REM Im File nodeinfo_NO.txt kommen Zeilen mit "Vendor" und "Agent" NICHT vor und als Ausgabe wird bei  
REM FIND "---------- C:\NNM_TEMP\MAIL\NODEINFO_NO.TXT"  und bei FINDSTR "ECHO is on" oder "ECHO is off"   
REM an die Parameter übergeben.
REM Gewünscht ist:  Wenn nichts gefunden wird, dann auch NICHTS in die Parameter eintragen !!
REM Errorlevel ist immer 0
REm --------------------------------------------------------------------------------------------------


FOR /F "delims=" %%F IN ('FIND "VENDOR:" C:\NNM_TEMP\Mail\nodeinfo_NO.txt') DO IF NOT "---------- C:\NNM_TEMP\MAIL\NODEINFO_NO.TXT" SET VAR_Node_Vendor=%%F  
FOR /F "delims=" %%G IN ('FINDSTR "AGENT:" C:\NNM_TEMP\Mail\nodeinfo_NO.txt') DO SET VAR_Node_Agent=%%G  

echo %VAR_Node_Vendor% >> C:\NNM_TEMP\Mail\checktext.txt
echo %VAR_Node_Agent% >> C:\NNM_TEMP\Mail\checktext.txt

echo %VAR_Node_Vendor%
echo %VAR_Node_Agent%
echo %errorlevel%

pause

exit


Und hier das komplette batch-file:
(Dies dient dazu Wenn ein Alarm im HPOV Nodemanager (NNM) meldet dass ein Device nicht erreichbar ist, wird dieses Batchfile gestartet, übernimmt gewisse NNM-Parameter und holt sich mittels ovtopodump Zusatzinformationen über das Device aus der NNM-Datenbank, Stellt ein Mail aus diesen Informationen zusammen und versendet diese mit "blat".

@echo off

REM NNM-Parm $x = %1 	=NNM-Datum
REM NNM-Parm $X = %2	=NNM-Time
REM NNM-Parm $s = %3 	=NNM-Alarm Serverity
REM NNM-Parm $U = %4 	=NNM-Uniqe Alarm ID
REM NNM-Parm $2 = %5 	=NNM-NodeName
REM NNM-Parm $R = %6    =NNM-True Source Node
REM NNM-Parm $aR = %7 	=NNM-True Source IP 
REM NNM-Parm $9  = %8   =NNM-Primary Failure Host
REM NNM-Parm $14 = %9 	=NNM-Severity Vor Event
REM NNM-Parm TestParm_Nr10 = %10 - shift

REM *****************Tempfile Variablen setzen**************************************

SET mail_temp_file=C:\NNM_TEMP\Mail\mailtemp_%~4.txt
SET mail_body_file=C:\NNM_TEMP\Mail\mailbody_%~4.txt

REM *****************Zusatzinfo mit ovotopodump & Nodevariable_$2=%5 holen und in ein Texfile mit NNM-UID-Variable$U=%4 im Namen abspeichern*****

"C:\Program Files\HP OpenView\bin\ovtopodump.exe" -v %5 > %mail_temp_file%  

REM *********Zusatzinfo aus Mailtempfile in Batch-Variablen schreiben****************

FOR /F "delims=xxx" %%A IN ('FIND "LOCATION:" %mail_temp_file%') DO SET VAR_Location=%%A  
REM Description kommt öfter vor - Interface Description ausschliessen !
SET "VAR_Description="  
FOR /F "delims=" %%B IN ('FIND /v "INTERFACE DESCRIPTION:" %mail_temp_file%^|FIND "DESCRIPTION:"') DO if not defined VAR_Description SET VAR_Description=%%B  
FOR /F "delims=xxx" %%C IN ('FIND "HOSTNAME:" %mail_temp_file%') DO SET VAR_Hostname=%%C  
FOR /F "delims=xxx" %%D IN ('FIND "SNMP ADDRESS:" %mail_temp_file%') DO SET VAR_snmp_address=%%D  
FOR /F "delims=xxx" %%E IN ('FIND "SNMP SYSNAME:" %mail_temp_file%') DO SET VAR_snmp_sysname=%%E  
REM OFFEN !!!!!!!!! - NODE VENDOR, AGENT, LABEL leider nur BEI CISCO.....
FOR /F "delims=---" %%F IN ('FIND "NODE VENDOR:" %mail_temp_file%') DO SET VAR_Node_Vendor=%%F  
FOR /F "delims=---" %%G IN ('FIND "NODE AGENT:" %mail_temp_file%') DO SET VAR_Node_Agent=%%G  
FOR /F "delims=---" %%H IN ('FIND "NODE LABEL:" %mail_temp_file%') DO SET VAR_Node_Label=%%H  

REM ************** Mailtempfile Löschen *****************************

DEL %mail_temp_file%

REM ************** Mailbodyfile Erstellen ***************************

REM echo Nachricht vom NMS-Server s060b061.kapsch.co.at - am %~1 um %~2 : >> %mail_body_file%
REM echo ---------------------------------------------------------------------------- >> %mail_body_file%
echo. >> %mail_body_file%
echo ALARM: Das Device %~5 ist nicht erreichbar !!! >> %mail_body_file%
echo. >> %mail_body_file%
echo ALARMSTUFE: %~3 >> %mail_body_file%
echo. >> %mail_body_file%
echo DATUM/UHRZEIT : %~1 - %~2  >> %mail_body_file%
echo. >> %mail_body_file%
echo ALARM-ID: %~4 >> %mail_body_file%
echo. >> %mail_body_file%
echo ------------------------------------------------------------------------------------------ >> %mail_body_file%
echo. >> %mail_body_file%
echo NODENAME: %~5 >> %mail_body_file%
REM echo %VAR_Node_Label% >> %mail_body_file%
REM echo %VAR_snmp_sysname% >> %mail_body_file%
echo %VAR_snmp_address% >> %mail_body_file%
echo. >> %mail_body_file%
echo %VAR_Location% >> %mail_body_file%
echo %VAR_Description% >> %mail_body_file%
echo %VAR_Node_Vendor%  >> %mail_body_file%
echo %VAR_Node_Agent% >> %mail_body_file%
echo. >> %mail_body_file%

echo. >> %mail_body_file%
echo ------------------------------------------------------------------------------------------ >> %mail_body_file%

REM ************** Mail mit BLAT versenden***************************

C:\blat262\full\blat.exe %mail_body_file% -subject "KAPSCH.net - NodeDown -  Das Device %5 ist nicht erreichbar !!!" -to nms-support@kapsch.net  

REM ************** Mailbodyfile Löschen *****************************

DEL %mail_body_file%

exit

REM ************ENDE


Irgend eine Idee wie man es anstellt wenn bei "find" oder "findstr" wenn nichts gefunden wird,
dass dann auch NICHTS übergeben wird ?

lg
souley
Member: bastla
bastla Jul 22, 2008 at 09:48:09 (UTC)
Goto Top
Hallo souley!

Irgend eine Idee wie man es anstellt wenn bei "find" oder "findstr" wenn nichts gefunden wird, dass dann auch NICHTS übergeben wird ?
Versuch es mit "findstr" und:
if defined VAR_Node_Vendor echo %VAR_Node_Vendor% > C:\NNM_TEMP\Mail\checktext.txt
Allerdings müsstest Du (ich hab mir den Rest des Batches nicht angesehen) dann ev eine schon bestehende "C:\NNM_TEMP\Mail\checktext.txt" vorweg löschen (was jetzt implizit durch die Verwendung des einzelnen ">" für die Umleitung erledigt wird).
Noch eine andere Möglichkeit (damit wird allerdings im Fall des Falles eine Leerzeile erzeugt): Wiederum "findstr" verwenden und dann:
echo\%VAR_Node_Vendor% > C:\NNM_TEMP\Mail\checktext.txt

Grüße
bastla
Member: souley
souley Jul 22, 2008 at 13:31:19 (UTC)
Goto Top
Hallo bastla !

Vielen Dank für die Hilfe !

Beide Lösungen funktionieren super.
Und natürlich auch "findstr" statt "find" wie auch von biber vorgeschlagen.

Habe mich für die Variante ohne Leerzeile entschieden :
FOR /F "delims=xxx" %%F IN ('FINDSTR /C:"NODE VENDOR:" %mail_temp_file%') DO SET VAR_Node_Vendor=%%F  
IF not defined VAR_Node_Vendor SET VAR_Node_Vendor=NODE VENDOR: N/A

echo %VAR_Node_Vendor% >> %mail_body_file%

Nachmals vielen Dank an alle Beteiligten !!!
Ihr habt mir sehr geholfen.

lg
Souley