breichardt
Goto Top

Einen bestimmten String an bestimmte Stellen in einer Textdatei schreiben

Einen bestimmten Textteil an bestimmte stellen in einer Textdatei schreiben

Hallo Liebe Administrator Community,

habe für mein Problem leider keine Lösung gefunden. Ich habe eine Textdatei mit ca. 400 Zeilen.

Jetzt würde ich gerne die Möglichkeit haben zu sagen, dass ich gerne einen String (z.B. "Programme") in einer bestimmten Anzahl von Zeilen (z.B. 20-360) an eine bestimmte Stelle schreibe (z.B. 3. Stelle).

Manuell wird das alles ein wenig viel Copy und Past Arbeit.

Hat eventuell einer von euch eine Lösung, oder wüsste ein Programm, welches eine solche Funktion bietet??

Vielen Dank.

Gruß
Fabian Reichardt

Content-Key: 77113

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

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: bastla
bastla 03.01.2008 um 14:28:08 Uhr
Goto Top
Hallo Breichardt!

Da Deine "bestimmte Anzahl von Zeilen" mit "20-360" doch ein wenig unbestimmt wirkt, solltest Du vielleicht etwas weiter ausholen und zumindest ein Kriterium für die zu ändernden Zeilen angeben.

Dabei könntest Du auch gleich erläutern, wie "an eine bestimmte Stelle schreiben" zu verstehen ist (etwa: zwischen der 2. und 3. Stelle des ursprünglichen Zeileninhaltes einfügen, oder: ab der 3. Stelle den gesamten oder auch nur den der Länge des einzufügenden Textes entsprechenden Zeileninhalt überschreiben).

[Edit] Und noch eine Frage: Enthält die Textdatei "!"? [/Edit]

Grüße
bastla
Mitglied: Breichardt
Breichardt 03.01.2008 um 14:48:44 Uhr
Goto Top
Hallo bastla,

vielen Dank für deine Antwort. Klar, werde es ein wenig verfeinern, leider sind die Dateien die ich damit bearbeiten will ein wenig unterschiedlich. Ich hätte aber kein Problem den Bereich einzugrenzen, mit zum Beispiel einem Anfangswort und einem Endwort. (*BEGIN* / *END*)

Du hast das genau richtig verstanden, ich möchte nach der 3. Stelle etwas einfügen, aber nicht ersetzten. Meistens geht es um Pfade, die nicht vollständig sind, vor die ich noch einen Unterordner schreiben möchte. ( \blabla.txt -> \Ordner\blabla.txt)

Der Zeilenanfang ist immer gleich.

Vielen Dank.

Gruß
Fabian
Mitglied: bastla
bastla 03.01.2008 um 18:15:29 Uhr
Goto Top
Hallo Breichardt!

Versuch es einmal mit dem folgenden VBScript:
'InsertText.vbs  

SourceFile = "D:\Deine Textdatei.txt"  
Pos = 3
InsertText = "Programme"  

MStart = "*BEGIN*"  
MEnd = "*END*"  
BakExt = ".bak"  

If WScript.Arguments.Count > 0 Then SourceFile = WScript.Arguments(0)
BakFile = SourceFile & BakExt
TargetFile = SourceFile

Set fso = CreateObject("Scripting.FileSystemObject")  
If Not fso.FileExists(TargetFile) Then
	WScript.Echo TargetFile & " konnte nicht gefunden werden!"  
	WScript.Quit(1)
End If

If fso.FileExists(BakFile) Then fso.DeleteFile(BakFile)
fso.MoveFile TargetFile, BakFile

Lines = Split(fso.OpenTextFile(BakFile, 1, False).ReadAll, vbCrLF)

Set Target = fso.OpenTextFile(TargetFile, 2, True)

Ins = False
For Each Line In Lines
	If InStr(Line, MStart) Then
		Ins = True
	ElseIf InStr(Line, MEnd) Then
		Ins = False
	Else
		LineNew = Line
		If Ins Then If Len(Line) >= (Pos - 1) Then LineNew = Left(Line, Pos - 1) & InsertText & Mid(Line, Pos)
		Target.WriteLine LineNew
	End If
Next

Target.Close

WScript.Echo "Done."  
Zur Verwendung:

Speichere (nach ev erforderlichen Anpassungen in den ersten Zeilen bis BakExt = ".bak") das Script mit einem Texteditor unter "InsertLine.vbs" (oder einem Dir sympathischeren Namen face-wink). Falls Du den Windows-Editor verwendest, bitte beim Speichern als Dateityp "Alle Dateien" wählen oder den Dateinamen unter Anführungszeichen setzen, da ansonsten als "InsertLine.vbs.txt" gespeichert wird.

Wenn Du das Script per Doppelklick startest, wird die bei "SourceFile = ...." eingetragene Datei bearbeitet. Alternativ kannst Du auch eine andere Textdatei auf das Script ziehen.

Falls die Datei gefunden wird, erstellt das Script zunächst eine Sicherungskopie mit dem Originaldateinamen und einem zusätzlichen ".bak", also etwa "D:\Deine Textdatei.txt.bak".

Danach wird zeilenweise die neue Datei erstellt. Eine Zeile, welche "*BEGIN*" oder "*END*" enthält, wird nur als Markierung für Beginn und Ende eines Zeilenblockes betrachtet und selbst nicht in die neue Datei geschrieben.

In alle Zeilen nach einer Zeile mit "*BEGIN*" bis zur Zeile vor einem "*END*" wird an der angegebenen Position (Zeile Pos = ...) der in der Zeile InsertText = "..." festgelegte Text eingefügt, alle anderen Zeilen werden unverändert in die neue Datei übernommen.

Nicht eingefügt wird der Text in Leerzeilen bzw in Zeilen, deren Länge geringer als (Position - 1) ist (bei einem Positionswert von 3 also nicht in eine Zeile, welche nur 1 Zeichen enthält).

Grüße
bastla
Mitglied: Breichardt
Breichardt 04.01.2008 um 06:50:29 Uhr
Goto Top
Guten Morgen bastla,

das funktioniert perfekt, genau so hatte ich mir das gedacht!!!!

Vielen vielen Dank für deine Hilfe, das erspart einiges an Arbeit!!!

Grüße
Breichardt
Mitglied: Coloneltw
Coloneltw 07.11.2008 um 08:08:56 Uhr
Goto Top
Hallo Bastla,
ich habe mich auf der Suche nach einem Script, welches Zeilen an eine bestehende Text Datei anknüpft, diesen Forumeintrag egfunden und dachte er könnte mir helfen.
Ich habe dein Script daher für Testzwecke in eine VBS Datei gepackt und an meine Anforderungen angepasst.
Das Script arbeitet auch, sichert die Datei und schreibt Done aber leider fügt er nicht die Zeilen ein.
Am Ende erzeugt er Leerzeilen aber das war es auch.
Das ganze ist zur Zeit eine Testdatei

'InsertText.vbs

SourceFile = "C:\Deine Textdatei.txt"
Pos = 3
InsertText = "Programme"

MStart = "*BEGIN*"
MEnd = "*END*"
BakExt = ".bak"

If WScript.Arguments.Count > 0 Then SourceFile = WScript.Arguments(0)
BakFile = SourceFile & BakExt
TargetFile = SourceFile

Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(TargetFile) Then
WScript.Echo TargetFile & " konnte nicht gefunden werden!"
WScript.Quit(1)
End If

If fso.FileExists(BakFile) Then fso.DeleteFile(BakFile)
fso.MoveFile TargetFile, BakFile

Lines = Split(fso.OpenTextFile(BakFile, 1, False).ReadAll, vbCrLF)

Set Target = fso.OpenTextFile(TargetFile, 2, True)

Ins = False
For Each Line In Lines
If InStr(Line, MStart) Then
Ins = True
ElseIf InStr(Line, MEnd) Then
Ins = False
Else
LineNew = Line
If Ins Then If Len(Line) >= (Pos - 1) Then LineNew = Left(Line, Pos - 1) & InsertText & Mid(Line, Pos)
Target.WriteLine LineNew
End If
Next

Target.Close

WScript.Echo "Done."


Das ist zur zeit der Inhalt meiner Textdatei

hallo
an
alle
leute
von heute
gehen
BEGIN
END
keine
Ahnung

Was mache ich falsch?
Vielen Dank schonmal
Mitglied: bastla
bastla 08.11.2008 um 12:06:54 Uhr
Goto Top
Hallo colonetw!

Das Script soll für alle zwischen "*BEGIN*" und "*END*" stehenden Zeilen ab Position 3 (= nach den ersten 2 Zeichen) den Text "Programme" einfügen und die Markierungen "*BEGIN*" und "*END*" entfernen - genau das tut es auch.

Da allerdings in Deiner Testdatei die genannten Markierungen (beachte "*" an Anfang und Ende) schon mal gar nicht enthalten sind (und es darüber hinaus dazwischen auch keine zu ändernden Zeilen gibt), wird tatsächlich nur eine Leerzeile am Ende hinzugefügt (was sich natürlich, bei Bedarf, auch vermeiden lässt).

Vielleicht erklärst Du daher einmal genau, was Du eigentlich mit dem Script erreichen willst.

Grüße
bastla
Mitglied: Coloneltw
Coloneltw 09.11.2008 um 12:05:54 Uhr
Goto Top
Hallo Bastla,
vielen Dank ersteinmal für deine Antwort.
Wir haben hier eine Textdatei, aus der ein programm seine Parameter abliest wie er damit verfahren soll. Wegen eines Schwenks auf ein anderes System müssen nun in jede Datei 2 Zeilen am Ende hinzugeschrieben werden, damit das Programm den Schwenk mitmacht.
Bei mehr als 150 Arbeitsplätzen macht das eine Menge Arbeit. Ich muss so oder so alle einzeln ansteuern und auch noch eine Datei austauschen (das habe ich aber schon gelöst), möchte aber per Script die Einzelarbeiten erledigen lassen.
Dann benötigen wir pro Rechner nur noch 30sec und nicht 5 Minuten.
Wie gesagt es gibt eine Textdatei. Am Ende der Datei sollen 2 Zeilen mit Text eingefügt werden. Ich habe das Script oben so verstanden, dass er nach Wörtern wie Begin und End sucht und dazwischen das Wort einfügt.
Wobei hier noch zu erwähnen ist, dass die Textdatei mit *.ini geschrieben wird.
Kannst du mir dabei auf die Sprünge helfen?
Danke schön
Gruß Thomas
Mitglied: bastla
bastla 09.11.2008 um 21:43:57 Uhr
Goto Top
Hallo Coloneltw!

Wenn nur zwei Zeilen am Ende hinzugefügt werden sollen, genügt eigentlich folgender Batch:
@echo off & setlocal
>>D:\Deine.ini echo Zeile1 Zeile1 Zeile1 Zeile1 Zeile1
>>D:\Deine.ini echo Zeile2 Zeile2 Zeile2 Zeile2
Oder, wenn's denn ein VBScript sein soll:
Set Datei = CreateObject("Scripting.FileSystemObject").OpenTextFile("D:\Deine.ini", 8)  
Datei.WriteLine "Zeile1 Zeile1 Zeile1 Zeile1 Zeile1"  
Datei.WriteLine "Zeile2 Zeile2 Zeile2 Zeile2"  
Datei.Close
Grüße
bastla
Mitglied: Coloneltw
Coloneltw 10.11.2008 um 10:16:37 Uhr
Goto Top
Hallo Bastla,
vielen Dank hat super funktioniert.
Kann man da eigentlich noch Abfragen reinbauen?
Mein Script ist jetzt soweit fertig und funktioniert auch.
Im ersten Schritt kopiert es eine verknüpfung auf dem Desktop von All Users. Im Zweiten Schritt kopiert es in einen Programmpfad eine dll Datei und im dritten Schritt schreibt es in diese ini Datei diese 4 Zeilen.
Ich muss jetzt aber vor jedem Start zunächst die PC Nummer des Zielsystems manuelle eintragen. Dazu kommt, dass diese Ini Datei auf einem Server liegt, im Homeverzeichnis, und das ist natürlich nicht PC bezogen sondern Userbezogen. Sprich der username muss im Script noch geändert werden (manuell). Um es noch komplizierter zu machen gibt es 2 unterschiedliche Pfade für das Homeverzeichnis. Einige wurden bereits umgestellt andere nicht.
Gibt es eine Möglichkeit, dass mein Script mit Parametern arbeitet und ich diese in einer anderen Datei Pflege?
Sprich in die Parameter Datei müsste folgendes rein:

PC=PC001
Username=test1
Homepfad=siehe Abfrage

Wenn Username im Pfad \\Servername\homeneu\ vorhanden dann nehmen sonst ist Pfad \\servername\username$

Das Script kopiert dann diese beiden Dateien auf den PC, den ich in der Parameter Datei angegeben habe und schreibt diese zeilen in den Pfad den die Parameterdatei ermittelt hat.

Wäre so ein Szenario, ich sage mal, nicht zu aufwendig darstellbar? Meine Kollegen wollen dies alles manuell machen, ich möchte aber meine Scriptfähigkeiten erweitern, da ich diese bestimmt noch öfters benötigen werde und dies sich hier anbietet.

Vielen Dank nochmal für deine bisherigen Antworten und viele Grüße
Mitglied: bastla
bastla 10.11.2008, aktualisiert am 03.05.2013 um 11:27:29 Uhr
Goto Top
Hallo Coloneltw!

Rein handwerklich würde das etwa so gehen:
HomeOld = "\\servername\username$"  
HomeNew = "\\Servername\homeneu"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Param = Split(fso.OpenTextFile("D:\Parameter.txt").ReadAll, vbCrLF)  
'jetzt steht in Param(0) die erste Zeile der "D:\Parameter.txt", in Param(1) die 2. Zeile, ...  
PC = Param(0)
User = Param(1)

If fso.FolderExists(HomeNew & "\" & User) Then  
    Home = HomeNew
Else
    Home = HomeOld
End If
Es stellt sich allerdings die Frage, ob das Ganze nicht noch stärker automatisierbar ist (etwa über ein "StartUp"-Script für die Rechner bzw ein userbezogenes "LogOn"-Script, oder eine Parameterdatei, welche im CSV-Format die Daten für alle PC enthält ...).
Noch als Anmerkung:
Falls im Script vorher schon ein "FileSystemObject" erzeugt wurde, ist natürlich die Zeile 4 hinfälllig (und ggf - wenn dafür nicht die Varaiable "fso" verwendet wurde - Zeile 5 bzw Zeile 10 anzupassen).

Der Rest würde dann so aussehen:
Set Datei = fso.OpenTextFile("D:\Deine.ini", 8)  
Datei.WriteLine "Zeile1 Zeile1 Zeile1 Zeile1 Zeile1"  
Datei.WriteLine "Zeile2 Zeile2 Zeile2 Zeile2"  
Datei.Close
Grüße
bastla
Mitglied: Coloneltw
Coloneltw 10.11.2008 um 13:31:53 Uhr
Goto Top
ok das habe ich soweit verstanden. Ich habe jetzt mal auf meinem Testsystem eine Parameter.txt angelegt
In dieser steht jetzt nur das drin

internet_pc
test1

dann habe ich eine Script.vbs geschrieben, die jetzt auf das testsystem eingestellt ist

01. HomeOld = "\\internet_pc\username$" --> der username ist bei Homeold ja Username$ aber halt Username=User und dann halt ein $ dahinter. Das sind Freigaben. Bei den alten Homeeinstellungen hat jeder User seine eigene Freigabe als Username$. Bei den neuen Home gibt es eine Freigabe namens homeneu und dahinter dann den Ordner für den User - wie bei ADS halt üblich.
02. HomeNew = "\\internet_pc\homeneu"

03. Set fso = CreateObject("Scripting.FileSystemObject")
04. Param = Split(fso.OpenTextFile("C:\Script\Parameter.txt").ReadAll, vbCrLF)
05. 'jetzt steht in Param(0) die erste Zeile der "C:\Script\Parameter.txt", in Param(1) die 2. Zeile, ...
06. PC = Param(0)
07. User = Param(1)
08.
09. If fso.FolderExists(HomeNew & "\" & User) Then
10. Home = HomeNew
11. Else
12. Home = HomeOld
13. End If
14.
15. Set Datei = fso.OpenTextFile("home\notes.ini", 8) --> genau hier komme ich nicht ganz klar, weil da müsste ja als Pfad der drin stehen den ich zuvor per Abfrage heraushole also home\notes.ini
16. Datei.WriteLine "Zeile1 Zeile1 Zeile1 Zeile1 Zeile1"
17. Datei.WriteLine "Zeile2 Zeile2 Zeile2 Zeile2"
18. Datei.Close

Ich kann ja nochmal kurz das ganze Wunschscript posten

Parameterdatei
PC="PCNAME"
USER="USERNAME"

Scrip
kopiere Datei1 nach \\PC\C$\Programme\...\
kopiere Datei2 nach \\PC\Dokumente und Einstellungen\All Users\Desktop\

HomeOld = "\\servername" --> bestehend aus USER + $ also (HomeOld & "\" & USER & "$")
HomeNew = "\\servername\homeneu"

If fso.FolderExists(HomeNew & "\" & USER) Then
Home = HomeNew
Else
Home = HomeOld
End If

Set Datei = fso.OpenTextFile("home\notes.ini", 8) --> die Datei vom Abfragepfad
Datei.WriteLine "Zeile1 Zeile1 Zeile1 Zeile1 Zeile1"
Datei.WriteLine "Zeile2 Zeile2 Zeile2 Zeile2"
Datei.Close

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken
Vielen Dank
Gruß Thomas
Mitglied: bastla
bastla 10.11.2008 um 13:45:53 Uhr
Goto Top
Hallo Coloneltw!

Kurz vorweg: Verwende bitte zum Posten von Scripts ...
Da ich leider den alten Basis-"Home"-Pfad falsch interpretiert hatte, sollte das eher so aussehen:
HomeOld = "\\servername" --> bestehend aus USER + $ also (HomeOld & "\" & USER & "$")  
HomeNew = "\\servername\homeneu"  

If fso.FolderExists(HomeNew & "\" & USER) Then  
    Home = HomeNew & "\" & USER  
Else
    Home = HomeOld & "\" & USER & "$"  
End If

Set Datei = fso.OpenTextFile(Home & "\notes.ini", 8) --> die Datei vom Abfragepfad  
Datei.WriteLine "Zeile1 Zeile1 Zeile1 Zeile1 Zeile1"  
Datei.WriteLine "Zeile2 Zeile2 Zeile2 Zeile2"  
Datei.Close
Jetzt ist auch in "Home" tatsächlich der user-spezifische Pfad (und nicht, wie vorher, nur der Basis-Pfad) enthalten.

Grüße
bastla

[Edit] "$" in Zeile 7 richtig gestellt [/Edit]
Mitglied: Coloneltw
Coloneltw 11.11.2008 um 08:51:57 Uhr
Goto Top
Hallo Bastla,
vielen Dank für deine Geduld, das hat prima funktioniert. Ich habe jetzt im Internet noch ein wenig gestöbert um auch das Kopieren von ein paar Dateien mit in das Script einzuarbeiten. Er sagt mir allerdings das er den Pfad nicht finden kann.
HomeOld = "\\internet_pc"   
HomeNew = "\\internet_pc\homeneu"   
desktop = "\\" & PC & "\c$\Dokumente und Einstellungen\All Users\Desktop\"  
notes = "\\" & PC & "\c$\Programme\lotus\notes\"  
 

Set fso = CreateObject("Scripting.FileSystemObject")   
Param = Split(fso.OpenTextFile("C:\Script\Parameter.txt").ReadAll, vbCrLF)   
'jetzt steht in Param(0) die erste Zeile der "C:\Script\Parameter.txt", in Param(1) die 2. Zeile, ...   
PC = Param(0) 
User = Param(1) 

If fso.FolderExists(HomeNew & "\" & User) Then   
    Home = HomeNew & "\" & USER  
Else 
    Home = HomeOld & "\" & USER & "$"  
End If

Set Datei = fso.OpenTextFile(home & "\notes.ini", 8)   
Datei.WriteLine "Zeile1 Zeile1 Zeile1 Zeile1 Zeile1"   
Datei.WriteLine "Zeile2 Zeile2 Zeile2 Zeile2"   

Set fso = CreateObject("Scripting.FileSystemObject")  
Set f1 = fso.GetFile("C:\script\mc.dll")  
f1.copy("notes")  

Datei.Close

die letzte Zeile sagt ja, dass er die Datei in den Zielpfad kopieren soll. Nun ist der Zielpfad das Objekt von oben namens "Notes". Habe ich was übersehen?
Gruß Thomas
Mitglied: bastla
bastla 11.11.2008 um 10:35:15 Uhr
Goto Top
Hallo Coloneltw!

Nun ist der Zielpfad das Objekt von oben namens "Notes".
... allerdings nur, wenn Du die Anführungszeichen entfernst, da ansonsten das Ziel eben "Notes" heißt (Unterschied Variable und Konstante) ...

Abgesehen davon kann das Kopieren aber selbst dann noch nicht funktionieren, da Du bereits in Zeile 4 (und 3) eine Variable (PC) zu verwenden versuchst, die ihren Wert erst in Zeile 10 erhält - der Pfad wäre daher:
"\\\c$\Programme\lotus\notes\"
Um das zu überprüfen, kannst Du (für die Testphase) eine Zeile
WScript.Echo "notes=" & notes
vor der "copy"-Zeile einfügen und so den Zielpfad anzeigen lassen.
Noch einige Anmerkungen:
  • Sobald Du mit dem Schreiben in die "notes.ini" fertig bist, sollte die Datei geschlossen werden - daher "Datei.Close" in die Zeile 22 verschieben.
  • Der oben schon angeführte Hinweis, dass Du ein "FileSystemObject" nicht mehrmals erzeugen musst, gilt auch für die Zeile 23 - diese kannst Du ersatzlos streichen (siehe Zeile 7).
  • Falls Du sie noch nicht haben solltest: Die Hilfedatei "script56.chm" für VBS (in einer deutschen Fassung) gibt es zB auf dieser Seite von "dieseyer.de".

Grüße
bastla