'*** v10.1 *** www.dieseyer.de ***************************** ' ' Datei: vbseditor+.vbs ' Autor: W. Schmelz ' Auf: www.dieseyer.de ' ' Vor der Ausführung das VBS als ' "V-b-sEditor+.v-b-s" speichern! ' '*********************************************************** '******************************************************** '* * '* Editoren gibt es viele! - Mich reizte es aber, mir * '* selbst einen mit Mitteln des H-t-a zu schreiben !! * '* Im Explorer ist eine beliebige Datei wählbar! Er - * '* möglicht wird dieses für "Txt", "V-b-s", "H-t-a" ! * '* Es wird hier mit eingebundener H-t-a gearbeitet,- * '* diese gibt die Zeilen der betrachteten Datei aus ! * '* - Oder Datei auf dieses Programm ziehen und fallen * '* lassen! Die Datei wird in nummerierten Zeilen ab- * '* schnittweise angezeigt. Dabei ist außer "Abbruch" * '* auch ein "Zurück" und natürlich "Weiter" möglich , * '* sowohl für die angezeigten Zeilenblöcke als auch * '* für die darin in einem Textfeld bearbeitbar ange - * '* zeigte Zeile! Diese kann man dann abändern und die * '* Änderung in der betreffenden " Datei " speichern! * '* Ferner können eine beliebige oder eine neue, noch * '* völlig leere Datei im Explorer aufgerufen werden ! * '* Es können die Objekte Fso, Wss oder der Inhalt der * '* Ablage eingefügt und auf Wunsch widerrufen werden! * '* Es kann auch ein bestimmtes "Wort" gesucht werden! * '* Außerdem ist ein Wort durch ein anderes ersetzbar! * '* Nachteil ist, dass nur eine Zeile immer bearbeitet * '* werden kann, diese kann man aber schnell wechseln! * '* Der Editor arbeitet wie andere, er druckt sogar!!! * '* * '******************************************************** 'CopyRight: W. Schmelz, 16.12.2009 Zeit = Timer ' Objekte u.a. werden für das Programm bereit gestellt : '******************************************************* Set Wss=WScript.CreateObject("WScript.Shell") Set Fso=WScript.CreateObject("Scripting.FileSystemObject") Set Arg=Wscript.Arguments Datei0=WScript.ScriptFullName UV=VbCR&VbCR ' Voreinstellung einiger wichtiger Variablen : '********************************************* Start="" Ende="" Neu="0" Anfang="1" FrageKorr="1" Plus="0" Wort="0" 'Bestimmtes Wort suchen in der " Datei " Block="0" 'Bei Blockaufrufen 1. Zeile als Textzeile Dazu="0" Suche="0" Ersatz="0" 'Wort ggf. durch Ersatzwort ersetzen Korr="0" 'Zeilenzahl-Korrektur bei überlangen Zeilen Folge="0" 'Folgebefehl bei Zeilenspeicherung Dim Ende, Doppel, Zeile(), Datei, AktVerz, Summe, Schnitt Dim Liste(), Eins, Stelle, Summ(), Schluss, Datei0, DateiZ Dim Wert, Frage, Wunsch, Start, Zeilen(), Noch, Nr, DateiN Dim UrZeile(), FragZeil, Zeil(), NochA, Neu, Wrt(), Plus Dim ZeilPlus(), FrageKorr, Block, Dazu, NochB, Zeit, Zei() Dim Wort, Hier, Numb, Stamm, Wt(), SuchDat, Tg, TempVerz Dim WortN, Ersatz '********************************************************** ' Das temporäre Arbeitsverzeichnis wird vorweg festgelegt : ' Das temp. Verzeichnis des Users verweigerte den Zugriff ? ' Vermutlich eine Abwehr evtl. " schädlicher " Programme !? '********************************************************** OrtP="C:\Programme\Schmelz.W" OrtPP=OrtP&"\"&"V"&"b"&"s"&"Editor" If not Fso.FolderExists(OrtP) then Fso.CreateFolder OrtP, true '"true" soll evtl. Schreibschutz aushebeln, auch für Weiteres! If not Fso.FolderExists(OrtPP) then Fso.CreateFolder(OrtPP) TempVerz=OrtPP&"\" Titel=" VbsEditor" 'Aufgesetzte Datei oder zurück Gemeldetes wird ermittelt: '******************************************************** For i=0 to Arg.Count-1 'Arg.Count:Zahl aufgesetzter Arg. Datei=Arg.Item(0) ' oder : For i=1 to Arg.Count / Datei=Arg.Item(0) If i=1 then Start=Arg.Item(1) If i=2 then FragZeil=Arg.Item(2) ' Leerzeilen / Leerstellen nicht möglich, s.u. If i=3 then Frage=Arg.Item(3) If i=4 then Neu=Arg.Item(4) If i=5 then Plus=Arg.Item(5) 'Zu suchendes Wort / evtl. Folgebefehl nach Speichern If i=6 then Wort=Arg.Item(6) Next ' Arg.Item(6) ist zu suchendes Wort oder Folgebefehl ? '***************************************************** If Left(Wort,3)="&%;" then Wort=Right(Wort,Len(Wort)-3) Folge="0" else Folge=Wort Wort="0" End If ' Wort ggf. in Wort und Ersatzwort aufspalten : '********************************************** Lang=Len(Wort) If (Folge="0" and Len(Wort)>1) then For i=1 to Lang If Mid(Wort,i,3 )="###" then WortN=Right(Wort,Len(Wort)-i+1-3) Wort=Left(Wort,i-1) Ersatz="1" End If Next End If 'Datei auf alte Form bringen, mit Leerstellen ! '********************************************** For i=1 to Len(Datei) ReDim Preserve Wt(i) Wt(i)=Mid(Datei,i,1) If Wt(i)=Chr(30) then Wt(i)=" " Next Datei=Join(Wt,"") 'Verlangtes Wort suchen und dessen Fundstellen ausgeben, 'oder das Wort mit einem gewünschten neuem Wort ersetzen '******************************************************* If Wort<>"0" then Suchen '******************************************************* Sub Suchen Titel=" Wort in Datei suchen ! " ' Wort auf alte Form bringen, mit Leerstellen ! '********************************************** For i=1 to Len(Wort) ReDim Preserve Wt(i) Wt(i)=Mid(Wort,i,1) If Wt(i)=Chr(30) then Wt(i)=" " Next Wort=Join(Wt,"") Wort=LCase(Wort) 'Vorliegende Datei öffnen und auslesen: '************************************** Set File=Fso.OpenTextFile(Datei,1,true) i=1 Do until File.AtEndOfStream ReDim Preserve Zei(i) Zei(i)=File.ReadLine i=i+1 Loop Ende=i-1 File.Close Set File=Nothing ' Suche des Wortes in den Zeilen der Datei : '******************************************* Hier="" Numb="0" 'Zahl der Fundstellen For i=1 to Ende k=1 Do until k>Len(Zei(i))-Len(Wort)+1 If LCase(Mid(Zei(i),k,Len(Wort)))=Wort then If Ersatz="1" then Zei(i)=Left(Zei(i),k-1)&WortN&Right(Zei(i),Len(Zei(i))-(Len(Wort)+k-1)) End If If Len(Hier)>0 then Hier=Hier&"|"&i If Hier="" then Hier=i Numb=Numb+1 'Wie oft "Wort" gefunden ? End If k=k+1 Loop Next ' Falls garnichts in der Datei zu finden gewesen war : '***************************************************** If Hier="" then MsgBox UV&VbCR&"Das Wort "" "&_ Wort&" "" ist nicht zu finden ! "&UV&_ VbCR,VbCritical,Titel:Exit Sub 'Abbruch ! ' Ggf. eine neue Datei mit dem Ersatzwort schreiben : '**************************************************** If Ersatz="1" then Stamm=Fso.GetParentFolderName(Datei) DateiNeu=Stamm&"\"&Fso.GetBaseName(Datei)&"-Neu."&Right(Datei,3) Set File=Fso.OpenTextFile(DateiNeu,2,true) For i=1 to Ende File.WriteLine(Zei(i)) Next File.Close Set File=Nothing MsgBox UV&VbTab&"Eine neue Datei :"&UV&" "&DateiNeu&_ " "&UV&VbTab&"wurde geschrieben!" End If ' Wenn nur Wort gesucht wird, die Fundstellen aufschreiben : '*********************************************************** If Ersatz="0" then 'Die Zeilen mit Nr. versehen: '**************************** For i=1 to Ende Zei(i)=i&VbTab&Zei(i) Next 'Die Aufsplittung der Fundorte in Ort(i), beginnend mit Ort(0)! '************************************************************** Ort=Split(Hier,"|") 'Ausgabedatei festlegen und gefundene Zeilen mit Nr. schreiben: '************************************************************** Stamm=Fso.GetParentFolderName(Datei) DateiN=Fso.GetBaseName(Datei)&"-Such.txt" AktVerz=Replace(Datei,Fso.GetFileName(Datei),"") DateiN=AktVerz&DateiN Set File=Fso.OpenTextFile(DateiN,2,true) File.WriteLine(" ") File.WriteLine(" Das Wort "" "&Wort&" "" steht in diesen Zeilen :") File.WriteLine("***************************************************") i=0 Do until i=Numb 'Beginn mit i=0 ! File.WriteLine(" ") File.WriteLine(Zei(Ort(i))) i=i+1 Loop File.Close Set File=Nothing 'Bei Sucherfolg Datei mit Zeilen-Nr. am Ende zeigen : '**************************************************** End If End Sub '**************************************************** ' Bei völligem Neustart des Programmes : '*************************************** If (Arg.Count=0 or Arg.Count=1) then Set Data=Fso.GetFolder(Left(TempVerz,Len(TempVerz)-1)).Files For each i in Data Fso.DeleteFile(i) ' Temporäres Verzeichnis leeren! Next End If If Frage=Start then Block="1" 'Bei Blockwechsel If Start="" then Start="1" '****************************************************** ' * ' Falls aber überhaupt garkeine Datei hier aufgesetzt * ' wurde, kann man diese jetzt im "Explorer" browsen , * ' oder nach eigenem Wunsch beliebig, neu festlegen !! * ' Da Set IE aber viel Zeit kostet, erst hier setzen ! * ' * '****************************************************** If Datei="" then Ask=InputBox(UV&UV&_ "Man kann eine Datei auf das Programm aufsetzen,"&UV&_ "oder im Explorer die gewünschte Datei auswählen,"&UV&_ "oder einen Ordner aussuchen für eine neue Datei !"&UV&_ "Im 1. Fall abbrechen und Drag & Drop anwenden,"&UV&_ "Dateiauswahl erfolgt mit "" 1 "", neue Datei mit "&_ """ 2""!"&UV&UV,Titel,"1") If Ask="" then WScript.Quit ' Abbruch, wenn "Cancel" If Ask="1" then ' Eine gewünschte Datei im Explorer aussuchen : '********************************************** Set IE=CreateObject("InternetExplorer.Application") IE.Navigate("About:Blank") IE.Document.Write"
"&_ "" IE.Height="0" 'Muss sein, damit IE verborgen! IE.Width="0" IE.Visible=True With IE.Document.All.Files .Click Datei= .Value End With IE.Quit Set IE=Nothing Suche="1" If Datei="" then WScript.Quit End If If Ask="2" then ' Eine gewünschte, neue Datei im Explorer festlegen : '**************************************************** Set ObF=CreateObject("Shell.Application"). _ BrowseForFolder(0,Befehl,BrowseInfo,17) '3. Stelle: 16 für Anzeige des ausgesuchten Ordners '4. Stelle: 17 für Arbeitsplatz, 0 wäre Desktop On Error Resume Next 'Evtl. Fehler werden ignoriert! Pfad=ObF.Self.Path Set All=Nothing If Err.Number="0" then AktVerz=Pfad On Error GoTo 0 'Ignorieren der Fehler aufheben! If Pfad="" then WScript.Quit Datei=InputBox(UV&UV&VbCr&"Bitte ergänzen Sie im aus"&_ "gesuchten Ordner den "&UV&_ "Namen der von Ihnen gewünschten neuen Datei !"&UV&_ UV,Titel,Pfad&"\... .vbs, txt oder h-t-a") If Datei = "" then WScript.Quit 'Eine Nachfrage, wenn diese Datei bereits vorhanden ist: '******************************************************* If Fso.FileExists(Datei) then Ask=MsgBox(UV&UV&"Die Datei existiert bereits ! "&_ "Fortsetzen ? "&UV&_ "Sie würde sonst einfach überschrieben !"&UV&_ UV,VbCritical+VbYesNo) If Ask="7" then WScript.Quit ' Bei Abbruch! End If ' Diese neue Datei wird nun erstellt : '************************************* Set Data=Fso.CreateTextFile(Datei) Data.WriteLine("") Data.WriteLine("") Data.Close Suche="1" End If End If 'Falls die aufgesetzte, bestimmte Datei ungeeignet ist: '****************************************************** Endg=LCase(Right(Datei,3)) If not (Endg="txt" or Endg="vbs" or Endg="hta") then MsgBox UV&VbCR&_ "Die aufgesetzte Datei ist ungeeignet ! "&_ UV&VbCR,VbCritical,Titel:WScript.Quit End If Titel=""""&Datei&"""" ' Momentanes Datum, heutiger Wochentag, Dateidaten ! '*************************************************** Tag=Weekday(Date) 'Den Wochentag bestimmen ! Select Case Tag Case "1" Tg="Sonntag" Case "2" Tg="Montag" Case "3" Tg="Dienstag" Case "4" Tg="Mittwoch" Case "5" Tg="Donnerstag" Case "6" Tg="Freitag" Case "7" Tg="Samstag" End Select Set File=Fso.GetFile(Datei) Gross=File.Size 'Größe der Datei in Byte Schaffen=File.DateCreated 'Datum der "Erstellung" Aenderg=File.DateLastModified 'Datum letzter Änderung Zugriff=File.DateLastAccessed 'Datum letzten Zugriffes '*************************************************** '* * '* Falls nicht die Rückwärtsdatei schon existiert * '* oder die aufgesetzte Datei verändert worden ist * '* diese aufgesetzte Datei zeilenweise auslesen ! * '* Die Zeilenlänge aber auf 100 Zeichen begrenzen, * '* indem der Rest in Zusatzzeilen darunter kommt ! * '* * '*************************************************** 'Hilfsdatei für die Kehrzeilen wird DateiR benannt: '*************************************************** DateiR=TempVerz&Fso.GetBaseName(Datei)&_ "-Rueck."&Endg If not Fso.FileExists (DateiR) or Neu="1" then '############################################## s.u. Set File=Fso.OpenTextFile(Datei,1,true) NochA="0" 'Zahl aller Zusatzzeilen i=1 Do until File.AtEndOfStream ReDim Preserve Zeile(i) ReDim Preserve UrZeile(i) Zeile(i)=File.ReadLine 'Zeilen von "Datei" lesen UrZeile(i-NochA)=Zeile(i) 'Urzeilen zurücklegen ' Alle Nr. auf gleiche Länge bringen: '************************************ Nr=i-NochA If Len(Nr)=1 then Nr="000"&Nr If Len(Nr)=2 then Nr="00"&Nr If Len(Nr)=3 then Nr="0"&Nr Zeile(i)=Nr&" "&Zeile(i) Noch="0" ' Zusatzzeilen dieser Zeile(i) 'Falls Zeile zu lang ist, in Zusatzzeilen aufteilen: '*************************************************** If Len(Zeile(i))>100 then ' <<<<<<<<<<<<<< s.u. Rest=Zeile(i) Zeile(i)=Left(Zeile(i),100) Rest=Right(Rest,Len(Rest)-100) 'Zeilenrest If Rest<>"" then k=i Do k=k+1 ReDim Preserve Zeile(k) If Len(Rest)<=100 then Zeile(k)=" "&Rest Rest="" else Zeile(k)=" "&Left(Rest,100) Rest=Right(Rest,Len(Rest)-100) 'Zeilenrest End If Noch=1+Noch Loop until Rest="" End If End If ' <<<<<<<<<<<<<< s.o. NochA=NochA+Noch 'Zahl bisheriger Zusatzzeilen i=i+1+Noch 'Zahl aller bisheriger Zeilen Loop Ende=i-1 'Die Zahl aller dieser Zeilen File.Close Set File=Nothing '****************************************************** ' * ' Beim Neustart die Textzeile in die 1. Zeile setzen: * ' * '****************************************************** If not Fso.FileExists(DateiR) then FragZeil=UrZeile(1) ' In dieser "FragZeil" die " " " mit "" " ersetzen : '******************************************************* i=1 Do until Mid(FragZeil,i,1)="" If Mid(FragZeil,i,1)="""" then FragZeil=Left(FragZeil,i-1)&"""&_ Right(FragZeil,Len(FragZeil)-i) i=i+1 End If i=i+1 Loop End If 'Zusatzzeilen hier definieren, aber erst später festlegen: '********************************************************* For i=1 to Ende ReDim Preserve ZeilPlus(i) ZeilPlus(i)="0" Next ' Die Anführungsstriche " in den Zeilen sind zu verdoppeln, ' ist zum Schreiben der " H-t-a " - Datei unbedingt nötig ! '********************************************************** For i=1 to Ende Doppel="0" 'Zahl der Verdoppelungen k=1 Do until k=Len(Zeile(i))+1+Doppel If Mid (Zeile(i),k,1)="""" then Zeile(i)=Left(Zeile(i),k)&""""&_ Right(Zeile(i),Len(Zeile(i))-k) Doppel=1+Doppel k=k+1 End If k=k+1 Loop Next '*********************************************************** '* * '* Da Hta - Programmteile wie Input - Fenster und Radio - * '* Button - statt nur angezeigt - ausgeführt werden, ergab * '* sich Chaos. So werden alle Zeilen rückwärts geschrieben * '* an "DateiZ" übergeben. Da werden sie wieder umgekehrt!! * '* * '*********************************************************** For i=1 to Ende ReDim Preserve Zeilen(i) Zeilen(i)=Zeile(i) Zeile(i)="" Next For i=1 to Ende For k=1 to Len(Zeilen(i)) Zeile(i)=Zeile(i)&Mid(Zeilen(i), _ Len(Zeilen(i))+1-k,1) Next Next '*********************************************************** ' * ' Die DateiR schreiben ( die rückwärts geschriebene aufge- * ' setzte Datei ) damit diese nicht laufend umzukehren ist! * ' * '*********************************************************** On Error Resume Next ' Bei H-t-a - Dateien traten teilweise Probleme auf !? Set Abcd=Fso.CreateTextFile(DateiR,true) For n=1 to Ende Abcd.WriteLine(Zeile(n)) Next Abcd.Close Set Abcd=Nothing On Error GoTo 0 End If '############################# s.o. '************************************************************** ' Folg. Abschnitt wird nur bei wiederholten Aufrufen gestartet: '************************************************************** If (Fso.FileExists(DateiR) and not Start="") then 'Diese rückwärts geschriebene Datei: " DateiR " jetzt auslesen: '************************************************************** Set Data=Fso.OpenTextFile(DateiR,1,true) NochA="0" Frage=CInt(Frage) ' Gefragte Zeile rückwärts schreiben, suchen! If Len(Frage)="1" then Frage="000"&Frage If Len(Frage)="2" then Frage="00"&Frage If Len(Frage)="3" then Frage="0"&Frage FrageRev=Right(Frage,1)&Mid(Frage,3,1)&Mid(Frage,2,1)&Left(Frage,1) k="0" i=1 Do until Data.AtEndOfStream ReDim Preserve Zeile(i) ReDim Preserve Zeil(i) ReDim Preserve ZeilPlus(i) Zeile(i)=Data.ReadLine 'Zeilen von "DateiR" lesen If Right(Zeile(i),4)=FrageRev then FrageKorr=i 'Beim Blockwechsel : " Frage " hat keine Zeilenverschiebung: '*********************************************************** If CInt(Start)=i then NochB=NochA If (CInt(Start)=i-1 and Block="1" and Right(Zeile(i-1),7) _ <>";061#& " and i>=2) then Frage=Frage-NochB If (CInt(Start)=i-1 and Block="1" and Right(Zeile(i-1),7) _ =";061#& " and i>=2) then Frage=Frage-NochB+1 Dazu="2" If Right(Zeile(i),7)=";061#& " then Frage=1+Frage Dazu="4" End If End If 'Eine Korrektur der Zeilenzahl bei " überlangen " Zeilen: '******************************************************** If Right(Zeile(i),7)=";061#& " then NochA=1+NochA ZeilPlus(i)=NochA ' Zahl der Zusatzzeilen Zeil(i)=Zeile(i) i=i+1 Loop Ende=i-1 Data.Close Set Data = Nothing ' Beim Blockwechsel die Textzeile an den Anfang setzen : '******************************************************* If Block="1" then FrageKorr=CInt(Start)+CInt(Dazu) ' Falls eine neue Zeile für das Textfeld bestimmt wurde , ' dann diese rückwärts geschriebene Zeile auch umkehren : '******************************************************** If FragZeil="&&##;;;" then 'Merkmal für neue Textzeile ' Die Zusatzzeilen sind nun wieder aneinander zu setzen, ' dabei sind auch die Nummern der Zeilen zu korrigieren ! '******************************************************** Doppel="0" For k=1 to Ende If Right(Zeile(k),35)=";061#& ;061#& ;061#& ;061#& ;061#& " then Zeil(k-1-Doppel)=Left(Zeile(k),Len _ (Zeile(k))-35)&Zeil(k-1-Doppel) Doppel=1+Doppel else Zeil(k-Doppel)=Zeile(k) End If Next 'Die neue Textzeile rückwärts, d.h. richtig schreiben: '***************************************************** FragZeil=Left(Zeil(Frage),Len(Zeil(Frage))-10) For k=1 to Len(FragZeil) FragZei=FragZei&Mid(FragZeil,Len(FragZeil)+1-k,1) Next FragZeil=FragZei ' In der neuen Zeile die " mit " " " ersetzen : '************************************************** i=1 Do until Mid(FragZeil,i,1)="" If Mid(FragZeil,i,2)="""""" then FragZeil=Left(FragZeil,i-1)&"""&_ Right(FragZeil,Len(FragZeil)-i-1) i=i+1 End If i=i+1 Loop End If End If '**************************************************************** ' * ' Die Leerstellen in "FragZeil" müssen unbedingt mit " " * ' ersetzt werden, sonst ist FragZeil bei "Weiter" oder "Zurück" * ' nicht übermittelbar, denn im Übermittelten sind " " verboten! * ' * '**************************************************************** If FragZeil<>"" then i=1 Do until Mid(FragZeil,i,1)="" If Mid(FragZeil,i,1)=" " then FragZeil=Left(FragZeil,i-1)&" "&_ Right(FragZeil,Len(FragZeil)-i ) End If i=i+1 Loop End If ' Bei ihrem Aufruf vor die Textzeile immer 10 Zeilen setzen : '************************************************************ If Plus="1" then Start=FrageKorr-10 If Start<1 then Start="1" '############################################################## '# # '# # '# H-t-a-Datei zur Anzeige des gewünschten Blockes schreiben: # '# # '# # '############################################################## DateiZ=TempVerz&"DateiZeigen."&"h"&"t"&"a" DateiOld=Fso.GetFileName(Datei) DateiOld=Left(DateiOld,Len(DateiOld)-4)&"Old"&Right(DateiOld,4) DateiOld=TempVerz&DateiOld 'Sicherungsdatei1 DateiNeu=Fso.GetFileName(Datei) DateiNeu=Left(DateiNeu,Len(DateiNeu)-4)&"Neu"&Right(DateiNeu,4) DateiNeu=TempVerz&DateiNeu 'Sicherungsdatei2 'Vorige Version von DateiZ löschen, wenn noch vorhanden: '******************************************************* On Error Resume Next If Fso.FileExists(DateiZ) then Fso.DeleteFile(DateiZ) On Error GoTo 0 ' Datei "DateiZ" ist jedes Mal völlig neu zu schreiben : '******************************************************* If not Fso.FileExists(DateiZ) then 'Nur bei Neustart die Frage links oben als 0001 setzen : '******************************************************* If (Arg.Count="1" or Suche="1") then Frage="0001" Set F=Fso.CreateTextFile(DateiZ) F.WriteLine(" ") F.WriteLine(" ") F.Write("