.sessl
Goto Top

Find, findstr, tokens, delims .. Erläuterungen

Hallo zusammen,

dadurch dass einige Softwareanbieter ihre Software nicht richtig programmieren, ist man gezwungen hinten herum selber aufzuräumen.
Evtl. kennt sich jmd. mit Symantecs Backup Exec aus, dann kann er dies evtl. nachvollziehen, andernfalls ist das auch nicht weiter schlimm.

Ich habe mir ein kleines Script geschrieben, welches die Auswahllisten vom Backup Exec wieder löscht.
Hat ein wenig gedauert, da die Command Line Application nicht richtig mit gespielt hat.

Ich hatte erst:

set exp=exp.txt
set exp1=exp1.txt
set log=log.txt

REM bemcmd -o251 > %exp%
REM for /F "tokens=2 delims={}" %%i in (%exp%) do (echo %%i>>%exp1%)  
Mit dem Befehl bemcmd -o251 lasse ich mir alle Auswahlisten ausgeben und bekomme folgendes

SCRIPT ID: {0769FFB7-2065-420E-BBB6-0004C1B01D96}
SCRIPT NAME: Wechsler inventarisieren 00528

SCRIPT ID: {878DED57-60E6-4456-B7B6-00341A9079A1}
SCRIPT NAME: Wechsler inventarisieren 00240

SCRIPT ID: {1F436E0D-6E1D-4F2C-AFD0-0036FDA9C085}
SCRIPT NAME: Wiederherstellen 00060

SCRIPT ID: {384C2A3C-A913-4FF3-93C5-0040C641E3ED}
SCRIPT NAME: Wechsler inventarisieren 00072
Mit dem kurzen Codeschnipsel oben hätte ich eine schöne Auflistung á la

0769FFB7-2065-420E-BBB6-0004C1B01D96
878DED57-60E6-4456-B7B6-00341A9079A1
1F436E0D-6E1D-4F2C-AFD0-0036FDA9C085
384C2A3C-A913-4FF3-93C5-0040C641E3ED
bekommen, doch das Löschen, obwohl es laut Guide beschrieben ist, hat mittes GUID nicht funktioniert.
Also doch den Listennamen auslesen:

@echo off & setlocal


set exp=exp.txt
set exp1=exp1.txt
set exp2=exp2.txt
set log=log.txt

bemcmd -o251 > %exp%
if exist %exp1% del %exp1%
if exist %exp2% del %exp2%

for /F "tokens=3 delims=:" %%i in ('findstr /n /C:"SCRIPT NAME:" %exp%') do (echo %%i>>%exp1%)  
type %exp1% | find /v "Meine" >> %exp2%  
for /F "tokens=1 delims=" %%i in (%exp2%) do (bemcmd -o221 -s"%%i")  

Ihr werdet sicher einen anderen, evtl. sogar schnelleren Weg finden, doch ich bin froh das es erstmal funktioniert (nach mehreren Stunden 'basteln')!
Mein erstes Problem war, da man bei delims keine 'Wörter' verwenden kann, habe ich mich für findstr entschieden, das Problem, dass die abgeschnittenen Zeilen mit einer Leerzeile vorangestellt gespeichert werden:
 Wechsler inventarisieren 00528
 Wechsler inventarisieren 00240
 Wiederherstellen 00060
 Wechsler inventarisieren 00072
Hier habe ich leider keinen Weg gefunden diese direkt in der Schleife mit zu entfernen.

Nächstes Problem, ich wollte in der selben Zeile hinter do und vor dem echo eine IF Abfrage nach einem Wert machen, welcher nicht in die %exp1% Variable soll. Hat aber nicht funktioniert.
Ist das überhaupt möglich? Ich habe mich dann für find /v entschieden, doch hier muss ich eine 2. txt-Datei anlegen lassen, da ich in die vorhandene nicht schreiben darf. Warum?

Kontext: in einer Zeile steht Meine, diese Zeile darf nicht übergeben werden, bzw. muss gelöscht werden. (Zeile 14)

Danach (Zeile 15) lese ich jede Zeile aus und lösche quasi mit dem Befehl bemcmd -o221 -s"Wechsler inventarisieren 00072" die Auswahlisten.
Der Befehl besteht darauf die Variable in Anführungszeichen zu setzen, ist dies der richtige Weg, oder gibt es einen anderen?


Für ein paar erleuchtende Hinweise wäre ich sehr dankbar!


ps. falls es euch keinen Mehraufwand macht ich hatte versucht die Zeilen, welche ignoriert bzw. gelöscht werden sollen,
in eine extra Datei einzutragen, in die man dann einfach Zeilen weise Einträge hinzufügen kann, damit auch andere Personen Auswahllisten eintragen können, welche eben nicht gelöscht werden sollen.

Versucht hatte ich das mit einer Schleife in einer Schleife, welche die Zeilen aus der Ignore.txt ausliest und danach Zeilenweise die exp1.txt überprüft ob eben diese Einträge vorhanden sind und sie gegebenenfalls löscht, doch auch hier scheiterte ich, leider.


Danke und Gruß
Tobias

Content-Key: 164598

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

Printed on: April 23, 2024 at 17:04 o'clock

Member: bastla
bastla Apr 14, 2011 at 12:59:43 (UTC)
Goto Top
Hallo .Seesl!

Mal überschlagsmäßig eingedampft (und ungetestet) etwa so:
@echo off & setlocal
set exp=exp.txt
set "ausw=auswahlliste.txt"  
set log=log.txt

for /f "tokens=2* delims= " %%i in ('bemcmd -o251^|findstr /C:"SCRIPT NAME:" %exp%^|findstr /v /g:"%ausw%"') do echo bemcmd -o221 -s"%%j"  
pause
Zum stressfreien Testen steht vor dem Löschbefehl noch ein "echo" ...

Grüße
bastla

[Edit] Fehlendes Prozentzeichen ergänzt und Schleife angepasst (siehe jeweils etwas weiter unten) [/Edit]
Member: .Sessl
.Sessl Apr 14, 2011 at 13:28:13 (UTC)
Goto Top
Hallo bastla,

danke für die schnelle Antwort, jedoch läuft das Script nicht durch, sonder bricht irgendwo ab. (noch so eine Sache, wie erkenne ich wo das Script ne 'macke' hat?)
Kann das sein?
Member: bastla
bastla Apr 14, 2011 at 13:35:30 (UTC)
Goto Top
Hallo .Sessl!

Vorzugsweise solltest Du einen Batch zum Testen mit "echo on" anstatt "echo off" verwenden und direkt aus der CMD-Shell starten ...

Die "auswahlliste.txt" sollte übrigens zumindest das Wort "Meine" enthalten (weitere Suchwörter dann jeweils in eine neue Zeile schreiben) und natürlich auch gefunden werden (daher ggf eine vollständige Pfadangabe verwenden).

Um übrigens ein ev störendes Leerzeichen am Beginn des ausgelesenen Namens zu vermeiden, könntest Du die "for"-Schleife mit
for /F "tokens=2* delims= "
beginnen.

Grüße
bastla
Member: Skyemugen
Skyemugen Apr 14, 2011 at 13:41:44 (UTC)
Goto Top
Aloha bastla!

also "%ausw" ... w ... w ... wird wohl nichts werden ;) da bin ich zu 100 Prozent sicher face-wink

greetz André

edit: gern geschehen, kann ja mal vorkommen beim Tippen ^_^
@.Sessl - wie du sicher mitbekommen hast, hat da etwas hochprozentiges gefehlt - nein kein Schnaps, sondern ein %-Zeichen ;)

edit² @bastla ... ungetestet schützt vor Tippfehlern nicht :P
Member: bastla
bastla Apr 14, 2011 at 13:44:33 (UTC)
Goto Top
Hallo Skyemugen!
... na dann - ich bin ja leicht zu überzeugen ... face-wink

Danke
bastla

[Edit] ... daher ja auch der Standard-Disclaimer "ungetestet" ... face-wink [/Edit]

[Edit 2]
ungetestet schützt vor Tippfehlern nicht :P
... möge aber eine leicht sensibilisierende Wirkung haben ... face-wink
[/Edit 2]
Member: .Sessl
.Sessl Apr 14, 2011 at 13:59:26 (UTC)
Goto Top
Hallo Ihr zwei,

okay, das Script läuft nun erstmal ohne murren.
Könnte mir evtl. nur nochmal kurz jemand die einzelnen Schritte erläutern, klar ist was eine Pipe macht und für was /C: und /G: stehen.
Das Tokens=2* hatte ich schon mal gesehen, doch wenn ich das einsetzen möchte macht es nie was es soll (ab Token 2 alles dahinter zu Token 2 zählen)

Eine Sache noch, da nun alles direkt über eine Zeile läuft, werden dementsprechend auch die Umlaute fehlerhaft ausgegeben:

bemcmd -o221 -s"Ausschl³sse"  
bemcmd -o221 -s"Wechsler l÷schen 00008"  
bemcmd -o221 -s"Wechsler l÷schen 00006"  
bemcmd -o221 -s"Wechsler l÷schen 00016"  
bemcmd -o221 -s"Wechsler l÷schen 00010"  
bemcmd -o221 -s"Wechsler l÷schen 00011"  
bemcmd -o221 -s"Wechsler l÷schen 00004"  
bemcmd -o221 -s"Wechsler l÷schen 00001"  
bemcmd -o221 -s"Wechsler l÷schen 00014"  
bemcmd -o221 -s"Wechsler l÷schen 00007"  
bemcmd -o221 -s"Wechsler l÷schen 00013"  
bemcmd -o221 -s"Wechsler l÷schen 00019"  
bemcmd -o221 -s"Wechsler l÷schen 00009"  
bemcmd -o221 -s"Wechsler l÷schen 00005"  
bemcmd -o221 -s"Wechsler l÷schen 00015"  
bemcmd -o221 -s"Wechsler l÷schen 00012"  
bemcmd -o221 -s"Wechsler l÷schen 00002"  
bemcmd -o221 -s"Wechsler l÷schen 00017"  
bemcmd -o221 -s"Wechsler l÷schen 00003"  
bemcmd -o221 -s"Wechsler l÷schen 00018"  

Evtl. doch über eine zweite Datei gehen?


Danke und Gruß
Tobias
Member: bastla
bastla Apr 14, 2011 at 14:04:26 (UTC)
Goto Top
Hallo .Sessl!
Evtl. doch über eine zweite Datei gehen?
... oder
chcp 1252>nul
an den Anfang stellen.
Das Tokens=2* hatte ich schon mal gesehen, doch wenn ich das einsetzen möchte macht es nie was es soll (ab Token 2 alles dahinter zu Token 2 zählen)
... alles dahinter zu Token 3 zählen - daher bei Schleifenvariable "%%i" für den gesuchten Teil "%%j" verwenden ...

Grüße
bastla
Member: .Sessl
.Sessl Apr 14, 2011 at 14:20:23 (UTC)
Goto Top
Hi bastla,

ich wüsste jetzt nicht genau was ich noch falsch machen könnte:

@echo off & setlocal

chcp 1252>nul

set exp=exp.txt
set "ausw=auswahlliste.txt"  
set log=log.txt

for /f "tokens=2* delims= " %%i in ('bemcmd -o251^|findstr /C:"SCRIPT NAME:" %exp%^|findstr /v /g:"%ausw%"') do echo bemcmd -o221 -s"%%j"  
pause
Aber die Ausgabe bleibt die gleiche ..

Wenn ich nun für die Schleifenvariable %%c verwenden würde, müsste ich %%d als Ausgabevariable nutzen?


Danke.
Gruß Tobias
Member: bastla
bastla Apr 14, 2011 at 14:28:16 (UTC)
Goto Top
Hallo .Sessl!
Aber die Ausgabe bleibt die gleiche ..
Sollte sie bei Verwendung der Codepage 1252 nicht ...
Du kannst aber natürlich testweise den Umweg über eine Datei nehmen - allerdings sollte es auch dann nicht ohne Umschalten der Codepage funktionieren.
Wenn ich nun für die Schleifenvariable %%c verwenden würde, müsste ich %%d als Ausgabevariable nutzen?
Ja - die einzelnen "token" stehen immer in den alphabetisch aufeinander folgenden Variablen ...

Grüße
bastla
Member: Skyemugen
Skyemugen Apr 14, 2011 at 15:17:50 (UTC)
Goto Top
Aloha,
[OT]
nur nebenbei bemerkt: das mit den codepages hat bei mir bei noch keiner Windows-Version funktioniert, für mich sind das Mythen *grins*
[/OT]
greetz André
Member: .Sessl
.Sessl Apr 14, 2011 at 15:29:12 (UTC)
Goto Top
Müsste man evtl. am Windows (Umgebungsvariable?) etwas einstellen, damit das klappt?

Bei anderen Scripten nutze ich folgendes, habe ich auch aus nem Forum, fand ich echt clever:
chcp 1252>nul
set ue=ü
set ae=ä
set oe=ö
set Uue=Ü
set Aae=Ä
set Ooe=Ö
set ss=ß
chcp 850>nul
Member: rubberman
rubberman Apr 14, 2011 at 22:33:57 (UTC)
Goto Top
Hallo .Sessl,

wie du an diesem Script Snippet siehst, reicht die Änderung der Codepage nach ANSI nicht aus. Du musst für die korrekte Ausgabe wieder zurück nach ASCII wechseln.
Beispiel für FOR Schleife:
@echo off &setlocal
chcp 1252>nul
for %%a in (Ä Ü Ö ä ö ü ß) do (
  chcp 850>nul
  echo %%a
)
pause
oder
@echo off &setlocal
chcp 1252>nul
for /f "tokens=*" %%a in ('echo Ä Ü Ö ä ö ü ß^&chcp 850^>nul') do echo %%a  
pause

Stellt sich aber noch die Frage, ob das für die tatsächliche Ausführung von bemcmd (also ohne echo) überhaupt nötig ist. Ich denke nicht.

Grüße
rubberman
Member: .Sessl
.Sessl Apr 15, 2011 at 08:42:58 (UTC)
Goto Top
Moin,

hast recht, das Script juckt's ohne ECHO nicht, danke.
Eine Frage noch, in eine FOR Anweisung, wieviele Pipes kann man bzw. darf man setzen und ist es ein muss dieses ^ (Dach) vor die Pipe zu setzen? ^|


Danke.
Member: bastla
bastla Apr 15, 2011 at 09:57:13 (UTC)
Goto Top
Hallo .Sessl!
wieviele Pipes kann man bzw. darf man setzen
Das weiß ich auch nicht - ich bin schon auf das Ergebnis Deiner diesbezüglichen Tests gespannt face-wink (allerdings kannst Du ja Suchbegriffe in Dateien zusammenfassen und bräuchtest dann eigentlich nur ein "/g:" und ein "/v /g:") ...
und ist es ein muss dieses ^ (Dach) vor die Pipe zu setzen? ^|
Ja (das sollten Deine Tests eigentlich schon gezeigt haben).

Grüße
bastla
Member: .Sessl
.Sessl Apr 15, 2011 at 10:17:30 (UTC)
Goto Top
Ich danke Euch für die rasche Hilfe und das ich wieder etwas dazu gelernt habe, danke!

Schönes Wochenende und ein frohes Fest!

Gruß
Tobias