http://dieseyer.de • all rights reserved • © 2011 v11.4

'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


http://dieseyer.de • all rights reserved • © 2011 v11.4