illvisionz
Goto Top

Wert auslesen und an bestimmter Stelle im Text einfügen

Guten Morgen

Ich bin neu hier und ihr habt mir schon viel geholfen, obwohl ich noch gar keine Frage gestellt habe, aber nun bin ich mit dem Latein am Ende bzw finde einfach keinen richtigen Beitrag der mir helfen kann. Es geht um ein kleines aber feines Batchprogramm, welches dem User einige Aufgaben erleichtern soll.

Ich habe im Userprofil eine *.ini Datei die bei jedem User unterschiedlich aufgebaut ist und auch unterschiedlich groß ist.
Aus dieser Datei möchte ich gerne bestimmte Werte (nicht die komplette Zeile) in eine andere Datei (*.txt) kopiert bekommen,
aber an eine bestimmte Stelle.

z.B. Wert aus ini Datei: MailServer=........(die Punkte sind die Werte die ich kopieren möchte)
Wert in der txt Datei: Client-Mailserver= (hier soll der Wert aus der ini stehen)

Außerdem kann es auch vorkommen, dass ich zwei Werte aus der ini Datei in der txt Datei hintereinander schreiben lassen muss

z.b. Wert1 \ Wert2

Ich habe es mit findstr /c "Wert" datei1.ini > datei2.txt versucht aber dort schreibt er mir nur die komplette Zeile aus der ini


Ist mit Batch überhaupt zu realisieren ?


Ich hoffe ihr könnt mir helfen und sollten Fragen im Raum stehen, versuche ich natürlich diese zu beantworten.......

Content-Key: 180338

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

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

Member: Skyemugen
Skyemugen Feb 10, 2012 at 09:50:19 (UTC)
Goto Top
Aloha,

ein wenig unvorteilhaft, eine Lösung auf halbgarem Beispiel zu präsentieren, grundsätzlich jedoch suchst du nach einer Lösung à la
for /f "tokens=2 delims==" %%s in ('findstr "MailServer= Client-Mailserver=" "Textdatei.txt"') do echo %%s>>"datei2.txt"  

Das ist jetzt nur grob und basiert auf einer Grundlage à la
Text
Text
Mailserver=Text
Client-Mailserver=Text
Text
AnderesZeug=Text
Text

Habe momentan leider keine Zeit, sonst würde ich dir das für Werte nacheinander gleich hinschreiben face-wink

greetz André
Member: bastla
bastla Feb 10, 2012 at 10:37:32 (UTC)
Goto Top
Hallo illvisionz und willkommen als Mitglied!

Wie Skye ja schon angedeutet hat, wäre es sinnvoll, etwas genauer zu beschreiben (oder am besten mit je einem Beispiel für die ini- und die txt-Datei - und das dann gleich als "" formatiert - zu dokumentieren), was im Detail passieren soll ...
Auch wenn sich das vermutlich per Batch wird lösen lassen: Wäre VBS auch akzeptabel?

Grüße
bastla
Member: illvisionz
illvisionz Feb 10, 2012 at 11:02:36 (UTC)
Goto Top
Hallo
VBS geht leider nicht....

Was Skye angedeutet hat, passt schon zur hälfte ;)

Ich versuche es anders zu erklären:
Datei 1:
11005676.ini
Text
Text
Mailserver=dmail11
Username=11005676
Speicherort=C:\Doku~1\test

Datei2:
setup.txt
Text
Text
Client-Mailserver=dmail11
username=11005676
AnderesZeug=Text
Client-Speicherort= C:\Doku~1\test\11005676.ini <- entweder der Wert aus username= oder der Dateiname
Text

Ich kann die Datei leider nicht posten, da sich dort Firmenrelevante Daten befinden aber das Beispiel gibt es eigentlich recht gut wieder.
Member: pieh-ejdsch
pieh-ejdsch Feb 10, 2012 at 13:13:29 (UTC)
Goto Top
moin illvisionz,

ist Heute die Formatierungshilfe defekt?

Ich kann mir mehr Daten nur Malen, aber das Beispiel gibt es eigentlich recht gut wieder.

<code>
01. @echo off & setlocal
02.
03. ::echo on
04.
05. set "INI=%userprofile%\Desktop\CMD\*.ini"
06. set "TXT=%userprofile%\Desktop\CMD\setup.txt"
07.
08. findstr /n "^" "%TXT%" > "%temp%\txttemp"
09.
10. For /f "delims==: tokens=2,4" %%a in ('findstr "Username" "%INI%"') do (
11. if "%%~na" equ "%%b" for /f delims^=: %%i in ('findstr /n "Client-Speicherort=" "%temp%\txttemp" ^|findstr /v "%%~nxa"') do (
12. for /f "usebackq delims=: tokens=1*" %%j in ("%temp%\txttemp") do if %%j neq %%i (>&3 echo %%k) else >&3 echo %%k\%%~nxa
13. )3>"%TXT%" )
14. goto :eof


Tatsache - die Formatierungshilfe scheint defekt...
Gruß
Member: illvisionz
illvisionz Feb 12, 2012 at 22:35:09 (UTC)
Goto Top
Könntest du mir den Code auch erklären ?
Ich muss den Code nämlich auch verstehen können um ihn zu erweitern ?

Wäre super thx.....
Member: illvisionz
illvisionz Feb 13, 2012 at 07:33:35 (UTC)
Goto Top
Guten Morgen
So ich habe jetzt mal beide Codes getestet und leider funktioniert es nicht so wie ich gedacht habe.
Ich vermute mal, dass ich mich evtl missverständlich ausgedrückt habe oder mein Beispiel nicht so der bringer war ;)
Ich habe die Dateien um die es geht nun mal anonymisiert und hoffe das es so besser geht.

Die Notes.ini ist natürlich noch größer und mit mehr Werten bestückt, ich habe nur noch die Werte drinnen gelassen die für mich wichtig sind.

Notes.ini
[NOTES]
Directory=C:\Documents and Settings\%username%\Local Settings\Application Data\Lotus\Notes\Data
KeyFilename=%username%.id
Ports=TCPIP
MailFile=mail09/%username%.nsf
MailServer=CN=DMail04CLA /OU=SRV /OU=Test /O=Land /C=DE

Die Setup.txt. soll aus einigen festen Werten bestehen und einigen Werten aus der Notest.ini. Die Reihenfolge der Werte ist vorgeschrieben und darf nicht verändert werden.

Setup.txt
Domino.Port=TCPIP <- soll der Wert "Ports" sein
Domino.Server=1
AdditionalServices=-1
Replication.Schedule=1
Username=%username% <- der Wert soll vom User selber eingegeben werden
Domino.Name=DMail04CLA/SRV/Test/Land/DE <- Der Wert soll aus "MailServer" kommen, aber ohne CN,OU,O usw
Keyfilename=C:\Documents and Settings\%username%\Local Settings\Application Data\Lotus\Notes\Data\%username%.id <- soll der Wert aus "Directory"+"KeyFilename" sein
$Client-Mailserver=CN=DMail04CLA /OU=SRV /OU=Test /O=Land /C=DE <- soll aus dem Wert "MailServer" kommen
$Client-Mailfile=mail09/%username%.nsf <- soll aus dem Wert "MailFile" kommen
$Client-MailDomain=TEST
$Client-AddrBkTomigrate=alt\names_old.nsf


Ich hoffe das es nun besser geht und würde mich über eure Lösungen sehr freuen.
Member: Skyemugen
Skyemugen Feb 13, 2012 at 08:03:51 (UTC)
Goto Top
Aloha,

arbeitet denn der Code nach deinen Vorstellungen?

Ich habe nämlich meine Zweifel an der Zeile 10 aber eventuell liegt es daran, dass ich heute noch kein Frühstück hatte

greetz André
Member: illvisionz
illvisionz Feb 13, 2012 at 08:20:12 (UTC)
Goto Top
Jetzt funktioniert dein Code bastla, bis auf zwei kleine Fehler:

Falsch: Domino.Name=DMail04CLA/OU/Test/O/DE//
Richtig: Domino.Name=DMail04CLA/SRV/Test/Land/DE

und bei Keyfilename= C:\Documents and Settings ist hinter dem "=" Zeichen ein Leerzeichen zu viel.


Ihr seid echt super und habt es echt drauf Respekt.....
Member: bastla
bastla Feb 13, 2012 at 13:14:34 (UTC)
Goto Top
Hallo illvisionz!

Sollte dann etwa so gehen:
@echo off & setlocal
set "Ein=notes.ini"  
set "Aus=setup.txt"  

for /f "tokens=1* delims==" %%i in ('findstr /b "Ports=" "%Ein%"') do >"%Aus%" echo Domino.Port=%%j  
>>"%Aus%" echo Domino.Server=1  
>>"%Aus%" echo AdditionalServices=-1  
>>"%Aus%" echo Replication.Schedule=1  
>>"%Aus%" echo Username=%%username%%  
for /f "tokens=3,5,7,9,11 delims== " %%i in ('findstr /b "MailServer=" "%Ein%"') do >>"%Aus%" echo Domino.Name=%%i/%%j/%%k/%%l/%%m  
>>"%Aus%" <nul set /p=Keyfilename=  
for /f "tokens=1* delims==" %%i in ('findstr /b "Directory=" "%Ein%"') do >>"%Aus%" <nul set /p=%%j  
for /f "tokens=1* delims==" %%i in ('findstr /b "KeyFilename=" "%Ein%"') do >>"%Aus%" <nul set /p=%%j  
>>"%Aus%" echo\  
for /f "tokens=1* delims==" %%i in ('findstr /b "MailServer=" "%Ein%"') do >>"%Aus%" echo $Client-Mailserver=%%j  
for /f "tokens=1* delims==" %%i in ('findstr /b "MailFile=" "%Ein%"') do >>"%Aus%" echo $Client-Mailfile=%%j  
>>"%Aus%" echo $Client-MailDomain=TEST  
>>"%Aus%" echo $Client-AddrBkTomigrate=alt\names_old.nsf  
Die Pfade für die "notes.ini" und die "setup.txt" msst Du natürlich noch komplettieren ...

Das Schema für die auszulesenden Werte ist in den meisten Fällen: Suche die Zeile, die mit dem Schlüsselwort und "=" (also zB MailServer=) beginnt und verwende alles nach dem ersten "=" (als Trennzeichen festgelegt) als Ausgabedaten; Besonderheiten:
  • für "Domino.Name" muss sowohl anhand der "=" als auch anhand der Leerzeichen getrennt werden - der Rest ist abzählen ...
  • Um mehrere Werte in eine Zeile schreiben zu können, wird (für "Keyfilename") die Schreibweise "<nul set /p=Ausgabe" verwendet.

Grüße
bastla
Member: illvisionz
illvisionz Feb 13, 2012 at 21:56:19 (UTC)
Goto Top
Guten Abend
Ich habe eben auch noch gesehen, dass der Wert %username% nicht übernommen wird.
Ich setz eine Variable mit set, welche vom User selber eingegeben wird am Anfang. Die Variable wird aber nicht hinter Username eingefügt.

Woran könnte das liegen ?
Member: bastla
bastla Feb 13, 2012 at 22:06:51 (UTC)
Goto Top
Hallo illvisionz!

Zunächst zu
bei Keyfilename= C:\Documents and Settings ist hinter dem "=" Zeichen ein Leerzeichen zu viel.
Prüfe bitte, ob in Deiner Zeile 11 am Ende das +berzählige Leerzeichen steht (wird leider durch die Forumssoftware hinzugefügt).
Falsch: Domino.Name=DMail04CLA/OU/Test/O/DE//
Mit Deinen oben geposteten Testdaten ergibt sich im Ergebnis bei meinem Test
Domino.Name=DMail04CLA/SRV/Test/Land/DE
Da anhand der Trennzeichen "=" und Leerzeichen aufgeteilt wird (siehe Zeile 10), kann es eigentlich nur an der Nummerierung der "tokens" (3,5,7,9,11) liegen, wenn's bei Dir anders aussieht - eigentlich sollte das so sein:
MailServer=CN=DMail04CLA /OU=SRV /OU=Test /O=Land /C=DE
1         |2 |3         |4  |5  |6  |7   |8 |9   |10|11
Grüße
bastla
Member: illvisionz
illvisionz Feb 14, 2012 at 07:58:36 (UTC)
Goto Top
Guten Morgen
Das mit dem Leerzeichen hat wunderbar geklappt und habe auch gleich alle andere Leerzeichen noch entfernt.
Danke für den Tipp

Das andere Problem besteht leider noch immer.
Ich habe mal den Test gemacht und nur das token 3 genommen und alle andere gelöscht.
Bei mir kommt dann aber folgendes Ergebnis:
Domino.Name=DMail04CLA/OU
Member: pieh-ejdsch
pieh-ejdsch Feb 14, 2012 at 10:39:14 (UTC)
Goto Top
moin illvisionz,

nimm als weiteren delimiter /
for /f "tokens=3,5,7,9,11 delims==/ " %%i in ('findstr /b "MailServer=" "%Ein%"') do >>"%Aus%" echo Domino.Name=%%i/%%j/%%k/%%l/%%m

Mit Formatting instructions in the posts insbesondere Kwählgohd wäre das aufgefallen.
MailServer=CN=DMail04CLA /OU=SRV /OU=Test /O=Land /C=DE
MailServer=CN=DMail04CLA/OU=SRV /OU=Test /O=Land /C=DE

Gruß Phil
Member: bastla
bastla Feb 14, 2012 at 10:54:38 (UTC)
Goto Top
@ph
... wobei allerdings oben (von dort hatte ich ja meine Testdaten) tatsächlich
MailServer=CN=DMail04CLA /OU=SRV /OU=Test /O=Land /C=DE
steht (und die Schreibweise ohne Leerzeichen vor "/OU" auch nicht wirklich sinnvoll erscheint) ...

Grüße
bastla
Member: illvisionz
illvisionz Feb 14, 2012 at 12:54:15 (UTC)
Goto Top
Hey Leute
Das hat nun auch geklappt super . Ihr habt echt was drauf!!!

Doch nachdem das Problem erledigt ist und ich das Thema eigentlich schon schließen wollte, fiel mir auf das bei Keyfile ja zuerst "Directory" ins File geschrieben wird und dahinter der "Keyfile" aber leider wird es nicht mit einem \ getrennt.
Habe mich evtl oben irrtümlich ausgedrückt.
Member: bastla
bastla Feb 14, 2012 at 15:48:57 (UTC)
Goto Top
Hallo illvisionz!
aber leider wird es nicht mit einem \ getrennt.
Und einfach den Backslash an das Ende der Zeile 12 zu schreiben hast Du nicht schon selbst versucht?

Grüße
bastla
Member: illvisionz
illvisionz Feb 15, 2012 at 06:48:48 (UTC)
Goto Top
Guten Morgen
Neuer Tag, neues Glück und siehe da alle meine Probleme sind gelöst.

Ihr sei super und danke für die Hilfe und ich markiere das Thema als gelöst

THX