17467
Goto Top

Eintrag aus div Datei auslesen und in eine weitere Datei schreiben

Hallo,

ich habe einen Ordner mit vielen Reg exporten und möchte jetzt 4 Werte auslesen und in eine weitere Datei schreiben.
Erste Zeile soll der Dateiname sein und dann die Werte usw ..

gruß ins WE
Kommentar vom Moderator Biber am 03.02.2010 um 20:10:06 Uhr
Verschoben von "Tools & Utilities" nach "Batch & Shell", auf "Erledigt" und "Geschlossen" gesetzt.

Content-Key: 49329

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

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: Dani
Dani 20.01.2007 um 12:19:07 Uhr
Goto Top
Hi,
wäre vielleicht gut, wenn du mal dein Vorhaben genauer erklärst.

4 Werte auslesen und in eine weitere Datei schreiben.
Sprich an Han des Schlüsselnamens? Ja - Und was machst du 2 oder 3 Schlüssel den gleichen Namen haben?! Nein - Wie möchtest du dann abfragen??


Gruß
Dani
Mitglied: 17467
17467 20.01.2007 um 12:44:20 Uhr
Goto Top
okay ...

ich habe einen Ordner mit Regestry Exporten.

z.b. c:\reglog dort gibt es 100 Dateien mit %computername%.reg

in dieser Datei steht ein Eintrag z.b

"enablesecuritysignature"=dword:00000000

diesen Wert und 3 andere möchte ich überprüfen ob am Ende eine 1 oder eine Null steht, wenn eine 1 steht, möchte ich den Namen der Datei in eine andere schreiben bzw ergänzen.

Somit kann ich überprfüfen, wo der falsche Eintrag an welchem Computer eingetragen ist.

Wir haben zwar AD, aber ich kann es nicht pflegen, habe aber Adminrechte ...

Das ganze kommt in die Start Batch vom DomainController.
Und bei jedem Start des PCs wird mir der Eintrag aktuell ausgelesen.

gruß
Mitglied: Dani
Dani 20.01.2007 um 13:00:42 Uhr
Goto Top
Hi,
Ok...also so müsste es gehen!

@ECHO off
::Kompletter Pfad zu dem REG-Ordner
SET dir_src=C:\te tes\assa     

::TXT-Datei, in der die Dateinamen gespeichert werden soll
SET file=asdf

FOR /f %%a IN ('dir /b "%dir_src%"') DO (  
     FOR /f "skip=3 delims=: tokens=2,3* " %%b IN ('type "%dir_src%\%%a"') DO (  
          IF "%%b" == "00000001" ECHO %%a >> "C:\test\%file%.txt"  
     )
)
Leider habe ich es nicht getestet. Sry...


Gruß
Dani
Mitglied: bastla
bastla 20.01.2007 um 13:38:27 Uhr
Goto Top
Hallo ranjid!

Basierend auf Dani's Ansatz hätte ich folgendes anzubieten

@echo off & setlocal
::Kompletter Pfad zu dem REG-Ordner
set dir_src=D:\Regtest

::TXT-Datei, in der die Dateinamen gespeichert werden soll
set file="D:\RegTest\RegCheck.txt"  
if exist %file% del %file%

for %%a in ("%dir_src%\*.reg") do for /f "skip=3 delims=" %%b in ('type "%%a"') do call :ProcessLine "%%a" "%%b"  
goto :eof
:ProcessLine
set key=enablesecuritysignature
set val=00000001
echo %2 | findstr /i /C:"%key%" && echo %2 | findstr /C:"%val%" && echo %~n1;%key% >> %file%  
::
set key=NoInternetOpenWith
set val=00000001
echo %2 | findstr /i /C:"%key%" && echo %2 | findstr /C:"%val%" && echo %~n1;%key% >> %file%  
::
...
...
...
Für jeden Key, den Du abfragen möchtest, müsstest Du einen Block wie oben in den beiden Beispielen nach ":ProcessLine" erstellen. Die Formatierung des Ergebnisses mit ";" als Trennzeichen erlaubt zB den Import in Excel - so wird's etwas übersichtlicher.

Grüße
bastla
Mitglied: Biber
Biber 20.01.2007 um 14:10:15 Uhr
Goto Top
...ich weiß' nicht...das wäre mir zuviel Heckmeck für diese Aufgabe.

Ich würde vom CMD-Prompt aus abfeuern...
findstr /i "enablesecuritysignature" z:\meine100RegFiles\*.reg|findStr "00000000"   
test.reg:"enablesecuritysignature"=dword:00000000  

...dann hätte ich alle Rechner mit einem 0-Eintrag. Oder ich fasse in eine Ergebnisdatei nacheinander alle gesuchten Werte zusammen:
findstr /i "enablesecuritysignature" z:\meine100RegFiles\*.reg >>alleWerte.txt
findstr /i "SignatureIsUgly" z:\meine100RegFiles\*.reg >>alleWerte.txt
...
etc...

Natürlich könnte ich diese ganzen FindStr's noch in eine FOR -Anweisung packen, wenn es sich lohnt..

Gruß
Biber
Mitglied: 17467
17467 20.01.2007 um 19:02:44 Uhr
Goto Top
Hallo Biber,

ich habe also die 100 Files und möchte in jeder Datei gucken, ob in dem 00000000 String eine 1 gesetzt ist, wenn dann möchte ich den Namen der Datei ( des Computer, der steht ja als Dateinamen ) in eine weitere Datei, dort gucke ich rein und überprüfe damit, ob es ein System gibt welches einen verkehtren Eintrag hat.
Mitglied: 17467
17467 20.01.2007 um 19:28:24 Uhr
Goto Top
Hallo Bastla,

hab mal den del rausgenommen, schreibt aber nichts .... es passiert zwar was, kommt aber keine text Datei ...

großes EDIT ...

meine Test haben alle den passenden Wert gehabt, also muss ich den Wert mal ändern und es klappt !!!

super !!!

Jetzt kann das Anmeldescript den Reg-Eintrag exportieren und ich gucke einmal am Tag drüber, ob ein Wert nicht richtig ist.

Zusätzlich ist es eine Kontrolle, da dieser Wert aus mit noch unbekannten Gründen geändert wird. Und ich kan jetzt genau den Tag sehen wann diese Wert wieder anderes ist.
Mitglied: 17467
17467 20.01.2007 um 19:45:35 Uhr
Goto Top
kleines edit

die Datei in der die Ergebnisse stehen soll noch mit im Dateinamen das Datum stehen, geht das ?
Mitglied: bastla
bastla 20.01.2007 um 21:22:47 Uhr
Goto Top
Hallo ranjid!

Ändere die "set file="-Zeile auf
set file="D:\RegTest\<b>%date:~6,4%-%date:~3,2%-%date:~0,2%-</b>RegCheck.txt"  

Grüße
bastla
Mitglied: 17467
17467 20.01.2007 um 22:46:16 Uhr
Goto Top
sieht auch gut aus, weil das Datum auch richtig angezeigt wird !!!
Mitglied: Biber
Biber 21.01.2007 um 12:54:45 Uhr
Goto Top
Nur um zu zeigen, dass es auch mit einem (formatierten) Einzeiler geht:

::--- snipp RegsAuswert.bat
@for %%x in ("EnableSecuritysignature.=dword:00000001"^  
            "RequireSecuritySignature.=dword:00000001"^  
            "OpenInternetWith.=dword:00000001"^  
            "EnablePlainTextPassword.=dword:00000001") do @(  
    for /f %%i in ('findstr /im /R "%%x" c:\reglogs\*.*') do @echo %%~ni %%x  
    )
...liefert, wenn er über die Dateien in c:\Reglogs schrapelt, folgenden Beispiel-Output bei mir:
$cmd$RegsAuswert.bat

compi15 "EnableSecuritysignature.=dword:00000001"  
compi18 "EnableSecuritysignature.=dword:00000001"  
compi21 "EnableSecuritysignature.=dword:00000001"  
compi30 "EnableSecuritysignature.=dword:00000001"  
compi16 "RequireSecuritySignature.=dword:00000001"  
compi20 "RequireSecuritySignature.=dword:00000001"  
compi24 "RequireSecuritySignature.=dword:00000001"  
compi28 "RequireSecuritySignature.=dword:00000001"  
compi12 "OpenInternetWith.=dword:00000001"  
compi17 "OpenInternetWith.=dword:00000001"  
compi22 "OpenInternetWith.=dword:00000001"  
compi27 "OpenInternetWith.=dword:00000001"  

Wenn ich diese Info ohne das (erläuternde) %%x, also den Suchstring ausgeben will, kann ich das letzte %%x am Ende ja weglassen.
Und den ganzen Krempel in die neue Zeitstempel-Datei leiten ginge mit:
RegsAuswert >D:\RegTest\%date:~6,4%-%date:~3,2%-%date:~0,2%-RegCheck.txt"

Denke, die "Massen"-Verarbeitung über FindStr-mit-Wildcards ist ein Vielfaches schneller als die Nachbildung per FOR-Anweisungen.

Und für mich ist der Einzeiler immer noch les- und wartbar. *gg

Grüße
Biber
Mitglied: bastla
bastla 21.01.2007 um 17:38:06 Uhr
Goto Top
@Biber

Sehr schöne Lösung.

Hinsichtlich Wartbarkeit: An Stelle der direkten Angabe könnten die Suchstrings bei wachsendem Umfang ja auch aus einer Textdatei kommen (ohne den "One-Liner-Status" zu beeinträchtigen face-wink).

Denke, die "Massen"-Verarbeitung über FindStr-mit-Wildcards ist ein Vielfaches schneller als die Nachbildung per FOR-Anweisungen.

Full ACK. Bei mir da oben war's ein typischer Fall von Betriebsblindheit: "findstr" verwende ich praktisch nur, um irgendwelche Ausgabelisten einzudampfen - die "eigentliche" Funktionalität ("Suchen von Dateien nach Inhalt") hatte ich schon ganz verdrängt.

Grüße
bastla
Mitglied: Biber
Biber 21.01.2007 um 20:09:51 Uhr
Goto Top
Danke, bastla.

"Hinsichtlich Wartbarkeit": ein FULL ACK von mir zurück.

Wo ich doch sogar schon bei simplen Batch-Dateien immer lamentiere, doch bitte Daten und Code zu trennen...

Wenn der Schnipsel bei mir "produktiv" wäre, hätte er zwei Parameter:
(1) Name der Suchstring-Datei
(2) QuellDir/evtl. Wildcards der zu durchsuchende Dateien.

Also bestünde sinngemäß aus der Zeile:
::--- snipp RegsAuswert-mit-Param.bat
@for /f %%x in (%1) do @ for /f %%i in ('findstr /im /R "%%x" %2') do @echo %%~ni %%x  

wo bei Parameter %1 eine Datei "Suchwerte.txt" dieser Form wäre:
::--- snipp Suchwerte.txt
EnableSecuritysignature.=dword:00000001
RequireSecuritySignature.=dword:00000001
OpenInternetWith.=dword:00000001
EnablePlainTextPassword.=dword:00000001
... wobei (hab ich vorhin vergessen zu erwähnen) das Anführungszeichen im Suchstring für den FindStr.exe-Aufruf durch einen "." ersetzt werden muss.

Ist ungetestet, weil... ich glaube nicht, dass ich mir dafür einen Batch schreiben würde... face-smile

Grüße
Biber
Mitglied: 17467
17467 21.01.2007 um 20:32:15 Uhr
Goto Top
ich will ja nicht stören .... ;>))

aber könnt ihr die Schnipsel mal zusammen fügen, damit ich das erkennen kann ...

thanks ....
Mitglied: Biber
Biber 21.01.2007 um 20:48:31 Uhr
Goto Top
Moin ranjid,

nimm aus meinem vorletzten Kommentar den Schnipsel "Regsauswert.bat", Copy&Paste den in eine gleichnamige Datei und passe die Suchstrings und den Pfad "c:\Reglogs\*.*" an.
- Oder-
Lege Dir eine Textdatei "Suchwerte.txt" an wie im letzten Posting und kopiere die eine Zeile "RegsAuswert-mit.Param.bat" in eine *.bat-Datei.

im 2. Fall aufrufen mit "Regsauswert.bat D:\einPfad\Suchwerte.txt D:\einpfad\DerRegDateien\*.*".

Mehr Hexenwerk ist nicht dabei.

Gruß
Biber
Mitglied: bastla
bastla 21.01.2007 um 20:53:31 Uhr
Goto Top
... und vielleicht noch die Umleitung der Ausgabe dazu, also Aufruf (für die letzte Variante):
Regsauswert.bat D:\einPfad\Suchwerte.txt D:\einpfad\DerRegDateien\*.*  > D:\nocheinPfad\%date:~6,4%-%date:~3,2%-%date:~0,2%-RegCheck.txt

Grüße
bastla