'v7.3*********************************************************** ' File: zeilennr-anpassen.vbs ' Autor: dieseyer@gmx.de ' http://dieseyer.de '*************************************************************** Option Explicit ' Siehe http://dieseyer.de/dse-wsh-lernen.html#OptionExpl Dim fso : Set fso = WScript.CreateObject("Scripting.FileSystemObject") Dim WSHShell : Set WSHShell = WScript.CreateObject("WScript.Shell") Dim oArgs : Set oArgs = Wscript.Arguments Dim i, Txt Dim DateiName, DateiSich 'hole alle Argumente '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For i = 0 to oArgs.Count - 1 ' hole alle Argumente If i = 0 Then DateiName = oArgs.item(i) If i = 1 Then DateiSich = oArgs.item(i) Next If DateiName = "" Then DateiName = WScript.ScriptFullName Txt = fso.GetParentFolderName( DateiName ) & "\" & fso.GetBaseName( DateiName ) & "-." & fso.GetExtensionName( DateiName ) If DateiSich = "" Then DateiSich = Txt Call ZeilenAnpassg( DateiName, DateiSich ) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If DateiName = WScript.ScriptFullName Then MsgBox "Das ist das Ende . . . ", , "333 :: " & WScript.ScriptName WScript.Quit '*************************************************************** Sub ZeilenAnpassg( Datei, Sicherg ) ' v7.3 - http://dieseyer.de '*************************************************************** If Datei = WScript.ScriptFullName Then MsgBox Datei & vbCRLF & Sicherg, , "333 :: " & WScript.ScriptName Dim DateiTypen : DateiTypen = ".hta.htm.html.vbs.cmd.bat.wsf" ' Von der 'Datei' wird eine Sicherung erstellt, wenn die Sicherungsdatei ' nicht existiert (wird für sendenan-sicherung.vbs benötigt) ' ' In allen Zeilen der 'Datei' wird nach ' :: ' (das sind 4 Zeichen) ' gesucht. Ist die Suche erfolgreich, werden zwei Fälle unterschieden - ' abhängig von den Zeichen _DAVOR_ : ' ' 1. Die Zeichen _DAVOR_ enthalten ein Anführungszeichen, ' gefolgt von einer max. 4stelligen Zahl (anschließend ' :: ') ' z.B.: MsgBox "123 :: Meldung" ' WScript.Echo "9 :: CScript.exe oder WScript.exe?" ' FileOut.WriteLine "9876 :: für LogDateien" ' Dies ist die VBS-Unterstützung (in .VBS / .HTA / .HTML) ' ' 2. Die Zeichen _DAVOR_ enthalten ein kleines 'o' (von 'Echo'), ' gefolgt von einem Leerschritt, gefolgt von einer max. ' 4stelligen Zahl (anschließend ' :: ') ' z.B.: Echo 123 :: Meldung ' Echo 6 :: Meldung um %date% %time% >> LogDatei.txt ' Dies ist die Befehlszeilen-Unterstützung (in .BAT / .CMD) ' Ist eine der beiden Bedingungen erfüllt, wird ' zu 1. die Zeichenkette zwischen Anführungszeichen und ' :: ' ' zu 2. die Zeichenkette zwischen 'o ' und ' :: ' ' durch die aktuelle Zeilennummer ersetzt - 4stellig mit führenden Nullen. ' Zum Testen das Skript ohne Parameter starten: Im Skript werden ' entsprechend den Bedingungen in den Beispielzeilen die korregierte Zeilem- ' nummer eingetragen und das Ergebnis mit Notepad angezeigt. ' Beim zweiten Aufruf dieses Skripts, werden auch die (MsgBox-) Meldungen ' die richtige Zeilennummer anzeigen. ' Hinweis: Die (Quell-) Datei wird _IMMER_ neu geschrieben! Dim fso : Set fso = WScript.CreateObject("Scripting.FileSystemObject") Dim Pos, Txt, Tst, i, n, PC, DateiName, Z Dim FileOut, FileIn If not fso.FileExists( Sicherg ) Then fso.CopyFile Datei, Sicherg, True ' Dateitypen prüfen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Tst = fso.GetExtensionName( Datei ) Tst = UCase( "." & Tst ) DateiTypen = UCase( DateiTypen ) If InStr( DateiTypen , Tst ) = 0 Then ' MsgBox "Dateien mit der Erweiterung" & vbCRLF & vbTab & Tst & vbCRLF & " werden nicht von ""Sub ZeilenAnpassg( Datei, Sicherg )"" unterstützt.", , "0489 :: " & WScript.ScriptName Exit Sub End If ' alle Zeilen lesen und an Array übergeben ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Set FileIn = FSO.OpenTextFile(Datei, 1 ) ' Datei zum Lesen öffnen i=0 Do While Not (FileIn.atEndOfStream) ' wenn Datei nicht zu ende ist, weiter machen ReDim Preserve Zeile(i) Zeile(i) = FileIn.Readline i = i + 1 Loop If i < 1 Then ReDim Preserve Zeile(i) Zeile(i) = "Leerdatei" End If FileIn.Close Set FileIn = nothing ' Array bearbeiten; hier: Zeilennummer einfügen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for i = LBound( Zeile ) to UBound( Zeile ) If InStrRev( Zeile(i), " :: " ) > 4 Then ' Zahl auf vier Stellen mit führender 0 erweitern ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n = i + 1 If Len( n ) = 1 Then n = "0" & n ' 2stellig If Len( n ) = 2 Then n = "0" & n ' 3stellig If Len( n ) = 3 Then n = "0" & n ' 4stellig ' If Len( n ) = 4 Then n = "0" & n ' 5stellig ' das erste Vorkommen von " :: " suchen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Pos = InStr( Zeile(i), " :: " ) If Pos > 7 Then ' weil sonst "Mid( Zeile(i), Pos - 6, 1 )" nicht geht ' das Anführungszeichen vor dem " :: " suchen und (neue) Zeilennummer einfügen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If Mid( Zeile(i), Pos - 2, 1 ) = Chr(34) Then Zeile(i) = Mid( Zeile(i), 1, Pos - 2 ) & n & " :: " & Mid( Zeile(i), Pos + 3 ) If Mid( Zeile(i), Pos - 3, 1 ) = Chr(34) Then Zeile(i) = Mid( Zeile(i), 1, Pos - 3 ) & n & " :: " & Mid( Zeile(i), Pos + 3 ) If Mid( Zeile(i), Pos - 4, 1 ) = Chr(34) Then Zeile(i) = Mid( Zeile(i), 1, Pos - 4 ) & n & " :: " & Mid( Zeile(i), Pos + 3 ) If Mid( Zeile(i), Pos - 5, 1 ) = Chr(34) Then Zeile(i) = Mid( Zeile(i), 1, Pos - 5 ) & n & " :: " & Mid( Zeile(i), Pos + 3 ) ' If Mid( Zeile(i), Pos - 6, 1 ) = Chr(34) Then Zeile(i) = Mid( Zeile(i), 1, Pos - 6 ) & n & " :: " & Mid( Zeile(i), Pos + 4 ) ' unnötige Leerzeichen entfernen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Zeile(i) = Replace( Zeile(i), " :: ", " :: " ) Zeile(i) = Replace( Zeile(i), " :: " , " :: " ) Zeile(i) = Replace( Zeile(i), " :: " , " :: " ) Zeile(i) = Replace( Zeile(i), " :: " , " :: " ) End If Tst = InStr( LCase( Zeile(i) ), ".echo """ ) ' wenn DAS in der Zeile vor 'Pos' steht, darf der nächste Abschnitt nicht ausgeführt werden If Tst = 0 Then Tst = 55555 If Pos > 5 AND Tst > Pos Then ' "o " (von 'echo 123 :: ' ) vor dem " :: " suchen und (neue) Zeilennummer einfügen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If Mid( Zeile(i), Pos - 2, 2 ) = "o " Then Zeile(i) = Mid( Zeile(i), 1, Pos - 1 ) & n & " :: " & Mid( Zeile(i), Pos + 4 ) If Mid( Zeile(i), Pos - 3, 2 ) = "o " Then Zeile(i) = Mid( Zeile(i), 1, Pos - 2 ) & n & " :: " & Mid( Zeile(i), Pos + 4 ) If Mid( Zeile(i), Pos - 4, 2 ) = "o " Then Zeile(i) = Mid( Zeile(i), 1, Pos - 3 ) & n & " :: " & Mid( Zeile(i), Pos + 4 ) If Mid( Zeile(i), Pos - 5, 2 ) = "o " Then Zeile(i) = Mid( Zeile(i), 1, Pos - 4 ) & n & " :: " & Mid( Zeile(i), Pos + 4 ) If Mid( Zeile(i), Pos - 6, 2 ) = "o " Then Zeile(i) = Mid( Zeile(i), 1, Pos - 5 ) & n & " :: " & Mid( Zeile(i), Pos + 4 ) ' If Mid( Zeile(i), Pos - 7, 2 ) = "o " Then Zeile(i) = Mid( Zeile(i), 1, Pos - 6 ) & n & " :: " & Mid( Zeile(i), Pos + 5 ) ' unnötige Leerzeichen entfernen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Zeile(i) = Replace( Zeile(i), " :: ", " :: " ) Zeile(i) = Replace( Zeile(i), " :: " , " :: " ) Zeile(i) = Replace( Zeile(i), " :: " , " :: " ) Zeile(i) = Replace( Zeile(i), " :: " , " :: " ) End If End If next ' Array in (Ziel-) Datei schreiben ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Datei = fso.GetParentFolderName( Datei ) & "\" & fso.GetBaseName( Datei ) & "--." & fso.GetExtensionName( Datei ) ' MsgBox Datei : WScript.Quit Set FileOut = FSO.OpenTextFile( Datei , 2, true) ' Datei zum Screiben öffnen; 2: immer neu anlegen ' FileOut.WriteLine( vbCRLF & now() & vbCRLF ) ' nur Für Testzwecke for i = 0 to ubound( Zeile ) FileOut.WriteLine( Zeile(i) ) next FileOut.Close Set FileOuT = nothing ' (Ziel-) Datei anzeigen ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If Datei = WScript.ScriptFullName Then WSHShell.run "notepad """ & Datei & """" , , True ' True: Skriptabarbeitung wartet bis Programm (notepad) beendet ist End Sub ' ZeilenAnpassg( Datei, Sicherg ) ' v7.3 - http://dieseyer.de