Mit Batch Datei Markierung in rtf doks finden( VB Script auch OK)
Mit Batch Datei Markierung( z.B. zzzh1) in rtf doks finden und diese mit laufenden Nummern im Format: A2234 ersetzen
Zur statistischen Auswertung möchte ich in rtf dokumenten nach unterschiedlichen Zeichenfolgen suchen lassen und diese mit fortlaufenden Zahlen im Format A001 ersetzen.
Wenn ein Absatz größer als 5 Zeilen leer kommt, sollte der erste Buchstabe wechseln, die Zahlen aber weiter addiert werden.
Interesannt währe auch eine Abfrage beim Starten der Batch nach der StartZahl Z.B. C7765, ab der weiter addiert wird.
Kann mir da jemand weiterhelfen?
Gruß Fraenky
Zur statistischen Auswertung möchte ich in rtf dokumenten nach unterschiedlichen Zeichenfolgen suchen lassen und diese mit fortlaufenden Zahlen im Format A001 ersetzen.
Wenn ein Absatz größer als 5 Zeilen leer kommt, sollte der erste Buchstabe wechseln, die Zahlen aber weiter addiert werden.
Interesannt währe auch eine Abfrage beim Starten der Batch nach der StartZahl Z.B. C7765, ab der weiter addiert wird.
Kann mir da jemand weiterhelfen?
Gruß Fraenky
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 66661
Url: https://administrator.de/forum/mit-batch-datei-markierung-in-rtf-doks-finden-vb-script-auch-ok-66661.html
Ausgedruckt am: 22.12.2024 um 21:12 Uhr
31 Kommentare
Neuester Kommentar
Hallo Fraenky und willkommen im Forum!
Manchmal sagen ja nicht nur Bilder, sondern auch Datenbeispiele mehr als viele Worte - vielleicht stellst Du in einem Vorher-Nachher-Vergleich ein Stück eines solchen rtf-Dokuments dar - dann wird auch deutlicher, ob Du meinst,
oder ob Dein Vorhaben ganz anders zu verstehen ist ...
Falls meine obige Deutung stimmen sollte: Wie groß wäre die Wahrscheinlichkeit, dass die Großbuchstaben nicht ausreichen (weil zu viele Leerzeilenblöcke enthalten sind) bzw was sollte in diesem Fall geschehen?
Grüße
bastla
Manchmal sagen ja nicht nur Bilder, sondern auch Datenbeispiele mehr als viele Worte - vielleicht stellst Du in einem Vorher-Nachher-Vergleich ein Stück eines solchen rtf-Dokuments dar - dann wird auch deutlicher, ob Du meinst,
- dass jedes vorkommende "zzzh1" durch ein $#### (oder $###) ersetzt werden soll,
- wobei $ entweder bei "A" oder bei einem anderen einzugebenden Buchstaben beginnt und nach jeweils mehr als 5 aufeinanderfolgenden Leerzeilen auf den nachfolgenden Buchstaben gesetzt werden soll,
- und #### für eine laufende Nummer steht, deren Startwert ebenfalls als Parameter übergeben werden soll, und die unabhängig vom davor stehenden Buchstaben bei jedem Auftreten von "zzzh1" um 1 zu erhöhen wäre,
oder ob Dein Vorhaben ganz anders zu verstehen ist ...
Falls meine obige Deutung stimmen sollte: Wie groß wäre die Wahrscheinlichkeit, dass die Großbuchstaben nicht ausreichen (weil zu viele Leerzeilenblöcke enthalten sind) bzw was sollte in diesem Fall geschehen?
Grüße
bastla
Hallo Fraenky!
In einer ersten Version werde ich, Dein Einverständnis voraussetzend, zur Vereinfachung auf das Zählen der einzelnen Absätze verzichten und stattdessen die Absatzblöcke kennzeichnen, sodass sich etwa folgende Markierungen ergeben könnten:
Das Wechseln der Buchstaben wäre dabei eigentlich nicht erforderlich - die Blocknummer erlaubt ohnehin eine eindeutige Zuordnung. Andererseits verursacht der Buchstabenwechsel kaum Aufwand ...
Das "Z" als Trennzeichen wäre vielleicht auch in Frage zu stellen - ein "_" würde die Teilung der Markierung (zumindest für das menschliche Auge) sicher leichter erfassbar machen. Dabei fällt mir ein: Wie soll das Ergebnis eigentlich verwendet / ausgewertet werden?
Da mir das RTF-Format nicht so geläufig ist (und Du noch nicht einmal ein schematisches Beispiel für den Aufbau Deiner Dateien dargestellt hast):
Kann ich für die Erkennung eines leeren Absatzes davon ausgehen, dass ein solcher jeweils eine eigene Zeile belegt (und diese daher nur
beinhaltet)?
Grüße
bastla
In einer ersten Version werde ich, Dein Einverständnis voraussetzend, zur Vereinfachung auf das Zählen der einzelnen Absätze verzichten und stattdessen die Absatzblöcke kennzeichnen, sodass sich etwa folgende Markierungen ergeben könnten:
A0001Z000001
A0001Z000002
A0001Z000003
A0001Z000004
B0002Z000005
B0002Z000006
C0003Z000007
C0003Z000008
C0003Z000009
C0003Z000010
C0003Z000011
...
F0032Z000294
F0032Z000295
G0033Z000296
...
Das "Z" als Trennzeichen wäre vielleicht auch in Frage zu stellen - ein "_" würde die Teilung der Markierung (zumindest für das menschliche Auge) sicher leichter erfassbar machen. Dabei fällt mir ein: Wie soll das Ergebnis eigentlich verwendet / ausgewertet werden?
Da mir das RTF-Format nicht so geläufig ist (und Du noch nicht einmal ein schematisches Beispiel für den Aufbau Deiner Dateien dargestellt hast):
Kann ich für die Erkennung eines leeren Absatzes davon ausgehen, dass ein solcher jeweils eine eigene Zeile belegt (und diese daher nur
\par
Grüße
bastla
Hallo Fraenky!
Ein Absatz ist eine Zeilenschaltung innerhalb des Textes (wobei es sehr wohl einen Unterschied zu "poor" Text gibt, etwa: Jedes Absatzende wird in RTF zusätzlich mit "\par" gekennzeichnet, und eine scheinbar "leere" Zeile kann zwar keinen Text, aber Formatinformationen - etwa Wechsel der Schriftart/-größe/-farbe - enthalten und wird dann von meinem Programm nicht als Leerzeile erkannt werden ...).
Grüße
bastla
Deinen gemachten Unterschied zwischen Zählen der Absätze und Absatzblöcke kennzeichenen verstehe ich nicht.
Ein Absatzblock ist für mich ein zusammenhängender Textteil. Nach Deiner Vorgabe endet ein solcher Block, wenn mehr als 5 Leerzeilen folgen. Innerhalb eines "Absatzblockes" in diesem Sinn können mehrere Absätze enthalten sein.Ein Absatz ist eine Zeilenschaltung innerhalb des Textes (wobei es sehr wohl einen Unterschied zu "poor" Text gibt, etwa: Jedes Absatzende wird in RTF zusätzlich mit "\par" gekennzeichnet, und eine scheinbar "leere" Zeile kann zwar keinen Text, aber Formatinformationen - etwa Wechsel der Schriftart/-größe/-farbe - enthalten und wird dann von meinem Programm nicht als Leerzeile erkannt werden ...).
Grüße
bastla
Hallo Fraenky!
Machmal dauert's lang, dann wieder länger ...
Jetzt hätte ich aber etwas zum Testen für Dich:
Obwohl ein kleiner "Batch"- (oder besser: "CMD"- ) Faktor enthalten ist (zum Einlesen des alphabetisch sortierten Ordnerinhaltes), musste ich (im Widerspruch zum im Titel Deines Beitrages geäußerten Wunsch) zu einer etwas höheren Programmiersprache (konkret: VBScript) greifen ...
Zur Verwendung: Im Prinzip genügt es, eine Datei des gewünschten Ordners oder diesen selbst aus dem Explorer auf die Script-Datei zu ziehen. Natürlich kannst Du auch von der Kommandozeile aus das Script starten und den RTF-Ordner als Parameter mitgeben - etwa so:
Als dritte Alternative käme schließlich noch die Auswahl aus einem herkömmlichen "Ordner-Wahl-Dialog" in Frage - dieser wird angeboten, wenn ohne Übergabe eines (gültigen) Parameters gestartet wurde.
Nach Eingabe der entsprechenden Variablen (an der Benutzerschnittstelle kannst Du ja noch feilen) führt das Script dann ohne weitere Rückfragen die Ersetzungen durch (wie ich hoffe ).
Bitte beachten: Es werden (zumindest in dieser Version) keine Sicherungskopien erstellt!
Grüße
bastla
Machmal dauert's lang, dann wieder länger ...
Jetzt hätte ich aber etwas zum Testen für Dich:
'DynRep.vbs
Const LIMIT = 5
Const PAR = "\par"
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
If WScript.Arguments.Count > 0 Then
sArg = WScript.Arguments(0)
If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
sPath = fso.GetFile(sArg).Path
sPath = Left(sPath, InStrRev(sPath, "\") - 1)
Else 'oder ev eines Ordners
If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
Set oFolder = CreateObject("Shell.Application") _
.BrowseForFolder(0, "Ordner wählen", 16, 17)
If TypeName(oFolder) = "Nothing" Then
WScript.Echo "Kein gültiger Ordner angegeben - Script wird beendet!"
WScript.Quit(1)
Else
sPath = oFolder.Self.Path
End If
End If
'Benutzereingaben
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
sPar = "@"
iPar = 10000
sDelim = "_"
lToken = 1000000
iLeer = 0
'Dateien alphabetisch sortiert einlesen
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d " & sPath & "\*.rtf")
If Not oExec.StdOut.AtEndOfStream Then
aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
'Alle Dateien durchgehen
For Each sFileName In aFiles
If Not bAll Then 'Zählung neu beginnen
sPar = "A"
iPar = 10001
lToken = 1000000
iLeer = 0
Else
iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
End If
'Datei behandeln
If sFileName <> "" Then ProcessFile sPath & "\" & sFileName
Next
Else
WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
sPath & _
vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
WScript.Quit(1)
End If
WScript.Echo "Ersetzen abgeschlossen."
Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""
Do While Not oTheFile.AtEndOfStream
sInL = oTheFile.ReadLine
If sInL <> PAR Then 'Kein leerer Absatz
If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
'... daher keine Aktion erforderlich.
Else 'LIMIT überschritten -> Buchstabenwechsel
If sPar < "Z" Then
sPar = Chr(Asc(sPar) + 1)
Else
sPar = "A"
End If
iPar = iPar + 1
End If
iLeer = 0 'Zählung Leerzeilen rücksetzen
'Zeile behandeln
aLine = Split(sInL, sToken, -1, vbTextCompare)
sLine = aLine(0)
For i = 1 To UBound(aLine)
lToken = lToken + 1
sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
Right(CStr(lToken), 6) & sPost
sLine = sLine & sTag & aLine(i)
Next
Else 'Leerzeile
iLeer = iLeer + 1
sLine = sInL
End If
If sOut <> "" Then
sOut = sOut & vbCrLF & sLine
Else
sOut = sLine
End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
Zur Verwendung: Im Prinzip genügt es, eine Datei des gewünschten Ordners oder diesen selbst aus dem Explorer auf die Script-Datei zu ziehen. Natürlich kannst Du auch von der Kommandozeile aus das Script starten und den RTF-Ordner als Parameter mitgeben - etwa so:
C:\Scripts\DynRep.vbs D:\Projekte\Demo
Nach Eingabe der entsprechenden Variablen (an der Benutzerschnittstelle kannst Du ja noch feilen) führt das Script dann ohne weitere Rückfragen die Ersetzungen durch (wie ich hoffe ).
Bitte beachten: Es werden (zumindest in dieser Version) keine Sicherungskopien erstellt!
Grüße
bastla
Hallo Fraenky!
Falls Du den Windows-Editor verwendet hast, wird die Datei vermutlich als "DynRep.vbs.txt" gespeichert sein (und ein Standard-Textdatei-Icon haben).
Lass Dir (durch Ausschalten der Explorer-Option "Extras / Ordneroptionen / Ansicht / Erweiterungen bei bekannten Dateitypen ausblenden") den Typ der gespeicherten Datei anzeigen, um ihn ändern zu können, oder speichere nochmals aus dem Editor, allerdings mit unter Anführungszeichen gesetztem Dateinamen und dem Dateityp "Alle Dateien".
Grüße
bastla
P.S.: Danke für die Vorschusslorbeeren ...
Falls Du den Windows-Editor verwendet hast, wird die Datei vermutlich als "DynRep.vbs.txt" gespeichert sein (und ein Standard-Textdatei-Icon haben).
Lass Dir (durch Ausschalten der Explorer-Option "Extras / Ordneroptionen / Ansicht / Erweiterungen bei bekannten Dateitypen ausblenden") den Typ der gespeicherten Datei anzeigen, um ihn ändern zu können, oder speichere nochmals aus dem Editor, allerdings mit unter Anführungszeichen gesetztem Dateinamen und dem Dateityp "Alle Dateien".
Grüße
bastla
P.S.: Danke für die Vorschusslorbeeren ...
Hallo Fraenky!
Für "xpos" und "ypos" sind nicht Pixel, sondern sog Twips einzusetzen - am besten ausprobieren (Wertebereich je nach Auflösung bis etwa 10000 oder 12000). Bezogen sind die Werte auf die linke obere Ecke des Bildschirms.
zu ersetzen.
Grüße
bastla
Die einzelnen Abfragen finden in etwas wild auftauchenden Fenstern statt.
Du kannst bei den einzelnen "InputBox"-Anweisungen noch folgende Parameter ergänzen (am Beispiel der Markierungs-Eingabe):sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung",, xpos, ypos)
... Fehler: Die Datei wurde nicht gefunden.
Resultiert vermutlich daraus, dass im Namen Deines Testordners Leerzeichen enthalten sind (was für VBS kein Problem wäre, aber da auch CMD - wegen der alphabetischen Sortierung - genutzt wird, muss ich die erforderlichen Anführungszeichen im Code nachtragen). Konkret ist die derzeitige Zeile 41 durchSet oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
Könntest Du bei der Überarbeitung auch die Funktionsfähigkeit bei den anderen Aktivierungsmethoden nochmal nachbessern? Datei auf Skriptdatei ziehen usw.
Mangels Zugriffes auf Dein System: Nein. Diese Funktionalität resultiert nicht aus dem Script-Code (bei mir funktionieren nämlich alle beschriebenen Methoden unter Verwendung des aus meinem Posting wieder heruntergeladenen Codes) ...Grüße
bastla
Hallo Fraenky!
Ausgehend von der Tatsache, dass aufgrund der heftigen Änderungen des Inhaltes die rtf-Dateien ohnehin einen sehr temporären Charakter haben dürften, habe ich folgende Vorgangsweise versucht (und mit einem Batch automatisiert):
In einem ersten Schritt wird (so gut das mit den eingestreuten Sonderzeichen eben funktioniert) eine alphabetisch sortierte Liste der rtf-Dateien mit laufender Nummer (dreistellig) erzeugt. Diese Liste ("DR.lst") wird zur Referenz im bearbeiteten Ordner gespeichert.
Anhand der Liste werden die Dateien temporär umbenannt (Dateinamen: "Laufnummer.rtf").
Die Verarbeitung dieser Dateinamen sollte mit dem bestehenden Script möglich sein. Das Script erzeugt jetzt zusätzlich eine Log-Datei, welche für jede verarbeitete Datei die zuletzt vorgenommene Ersetzung und den temporären Namen auflistet, also etwa:
Nach Ende des Scripts werden die Dateien erneut umbenannt, indem an die Nummer der ursprüngliche Name angefügt wird - damit kann die Sortierung auch im Explorer nachvollzogen werden.
Sollte es nötig sein, die Laufnummer wieder zu entfernen, kann dies mit einer weiteren Batchdatei unter Verwendung der Referenzliste durchgeführt werden (bzw aufgrund des einheitlichen Formates im Notfall auch ohne die Liste) - siehe dazu unten "RestoreFileNames".
Das Script selbst habe ich neben dem Hinzufügen des Loggens noch in einem Punkt verändert: In der letzten Version war es möglich, dass Buchstaben ausgelassen wurden (Beispiel: nach einem Block von 8 Leerzeilen wurde der Buchstabe geändert, im nächsten Textblock war keine Ersetzung vorzunehmen, und ein weiterer großer Leerzeilenblock führte dazu, dass der - gar nicht verwendete - Buchstabe neuerlich gerändert wurde) - dies habe ich jetzt behoben.
Zur Verwendung: Gestartet wird über die folgende Batchdatei (auch hier ist ein Aufruf mit Parameter oder Drag & Drop möglich oder aber, Du erstellst im versteckten Ordner "%userprofile%\SendTo", im Normalfall ist dies "C:\Dokumente und Einstellungen\Username\SendTo", eine Verknüpfung zur Batchdatei - dann steht diese auch im "Senden an"-Kontextmenü zur Auswahl):
Der Scriptcode sieht (vorbehaltlich Deiner Änderungen bei den "InputBox"-Anweisungen) jetzt so aus:
Noch ein Hinweis zur "MsgBox": Da diese keine Parameter "xpos" und "ypos" kennt und daher nicht exakt positioniert werden kann, könntest Du ersatzweise eine "InputBox" verwenden. Der Code dafür:
Nur bei Eingabe einer mit "J" oder "j" beginnenden Antwort wird über alle Dateien fortlaufend nummeriert.
Abschließend noch die "RestoreFileNames"-Batchdatei:
Auch dieser Batch erwartet beim Aufruf die Übergabe einer Datei oder eines Ordners und entfernt dann (falls eine "DR.lst" im übergebenen Ordner enthalten ist) die laufenden Nummern vor den in der Liste aufscheinenden rtf-Dateien.
Grüße
bastla
Ausgehend von der Tatsache, dass aufgrund der heftigen Änderungen des Inhaltes die rtf-Dateien ohnehin einen sehr temporären Charakter haben dürften, habe ich folgende Vorgangsweise versucht (und mit einem Batch automatisiert):
In einem ersten Schritt wird (so gut das mit den eingestreuten Sonderzeichen eben funktioniert) eine alphabetisch sortierte Liste der rtf-Dateien mit laufender Nummer (dreistellig) erzeugt. Diese Liste ("DR.lst") wird zur Referenz im bearbeiteten Ordner gespeichert.
Anhand der Liste werden die Dateien temporär umbenannt (Dateinamen: "Laufnummer.rtf").
Die Verarbeitung dieser Dateinamen sollte mit dem bestehenden Script möglich sein. Das Script erzeugt jetzt zusätzlich eine Log-Datei, welche für jede verarbeitete Datei die zuletzt vorgenommene Ersetzung und den temporären Namen auflistet, also etwa:
C0003_000009 001.rtf
G0007_000028 002.rtf
...
Sollte es nötig sein, die Laufnummer wieder zu entfernen, kann dies mit einer weiteren Batchdatei unter Verwendung der Referenzliste durchgeführt werden (bzw aufgrund des einheitlichen Formates im Notfall auch ohne die Liste) - siehe dazu unten "RestoreFileNames".
Das Script selbst habe ich neben dem Hinzufügen des Loggens noch in einem Punkt verändert: In der letzten Version war es möglich, dass Buchstaben ausgelassen wurden (Beispiel: nach einem Block von 8 Leerzeilen wurde der Buchstabe geändert, im nächsten Textblock war keine Ersetzung vorzunehmen, und ein weiterer großer Leerzeilenblock führte dazu, dass der - gar nicht verwendete - Buchstabe neuerlich gerändert wurde) - dies habe ich jetzt behoben.
Zur Verwendung: Gestartet wird über die folgende Batchdatei (auch hier ist ein Aufruf mit Parameter oder Drag & Drop möglich oder aber, Du erstellst im versteckten Ordner "%userprofile%\SendTo", im Normalfall ist dies "C:\Dokumente und Einstellungen\Username\SendTo", eine Verknüpfung zur Batchdatei - dann steht diese auch im "Senden an"-Kontextmenü zur Auswahl):
@echo off & setlocal
if not exist %1 goto :eof
cd /d "%~f1" 2>nul || cd /d "%~dp1"
echo Bearbeite Dateien in %cd% ...
set "List=DR.lst"
set /a Nr=1001
if exist "%List%" del "%List%"
for /f "delims=" %%i in ('dir /b /on /a-d *.rtf') do call :ProcessFile "%%i"
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do ren "%%j" %%i.rtf
echo Script wird gestartet ...
C:\Skripts\DynRep.vbs "%cd%"
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist %%i.rtf ren %%i.rtf "%%i_%%j"
goto :eof
:ProcessFile
(echo %Nr:~-3%=%~1)>>"%List%"
set /a Nr+=1
goto :eof
'DynRep.vbs
Const LIMIT = 5
Const PAR = "\par"
Const LOGFILE = "DynRep.log"
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
If WScript.Arguments.Count > 0 Then
sArg = WScript.Arguments(0)
If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
sPath = fso.GetFile(sArg).Path
sPath = Left(sPath, InStrRev(sPath, "\") - 1)
Else 'oder ev eines Ordners
If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
Set oFolder = CreateObject("Shell.Application") _
.BrowseForFolder(0, "Ordner wählen", 16, 17)
If TypeName(oFolder) = "Nothing" Then
WScript.Echo "Kein gültiger Ordner angegeben - Script wird beendet!"
WScript.Quit(1)
Else
sPath = oFolder.Self.Path
End If
End If
'Benutzereingaben
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
sPar = "@"
iPar = 10000
sDelim = "_"
lToken = 1000000
iLeer = 0
'Logdatei erstellen
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)
'Dateien alphabetisch sortiert einlesen
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
If Not oExec.StdOut.AtEndOfStream Then
aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
'Alle Dateien durchgehen
For Each sFileName In aFiles
If Not bAll Then 'Zählung neu beginnen
sPar = "A"
iPar = 10001
lToken = 1000000
iLeer = 0
bLUsed = False
Else
iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
bLUsed = True
End If
'Datei behandeln ...
If sFileName <> "" Then
ProcessFile sPath & "\" & sFileName
'... und protokollieren
oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
Right(CStr(lToken), 6) & " " & sFileName
End If
Next
Else
WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
sPath & _
vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
WScript.Quit(1)
End If
oLog.Close
'WScript.Echo "Ersetzen abgeschlossen."
Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""
Do While Not oTheFile.AtEndOfStream
sInL = oTheFile.ReadLine
If sInL <> PAR Then 'Kein leerer Absatz
If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
'... daher keine Aktion erforderlich.
Else 'LIMIT überschritten -> Buchstabenwechsel, ...
If bLUsed Then '... falls Buchstabe bereits verwendet wurde
If sPar < "Z" Then
sPar = Chr(Asc(sPar) + 1)
Else
sPar = "A"
End If
iPar = iPar + 1
bLUsed = False
End If
End If
iLeer = 0 'Zählung Leerzeilen rücksetzen
'Zeile behandeln
aLine = Split(sInL, sToken, -1, vbTextCompare)
sLine = aLine(0)
For i = 1 To UBound(aLine)
lToken = lToken + 1
sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
Right(CStr(lToken), 6) & sPost
sLine = sLine & sTag & aLine(i)
bLUsed = True
Next
Else 'Leerzeile
iLeer = iLeer + 1
sLine = sInL
End If
If sOut <> "" Then
sOut = sOut & vbCrLF & sLine
Else
sOut = sLine
End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
R = InputBox("Alle Dateien als Gesamtprojekt betrachten (J/N)?", "Gesamtprojekt", "J", xpos, ypos)
If UCase(Left(R, 1)) = "J" Then bAll = True
Abschließend noch die "RestoreFileNames"-Batchdatei:
@echo off & setlocal
if not exist %1 goto :eof
cd /d "%~f1" 2>nul || cd /d "%~dp1"
set "List=DR.lst"
if not exist "%List%" goto :eof
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist "%%i_%%j" ren "%%i_%%j" "%%j"
Grüße
bastla
Hallo Fraenky!
Sinn hat mE eine derartige Vorgabe nur, wenn die Option "Gesamtprojekt" gewählt wurde, daher wird der Startbuchstabe/-wert nur in diesem Fall abgefragt. (Ich selbst mag nicht durch Abfragen der Art
Die eingegebenen Informationen werden hinsichtlich des Wertebereiches überprüft. Bei einem Abbruch der Eingabe (eines einzelnen Wertes) wird einfach ohne weitere Rückfrage der jeweilige Standardwert ("A", "0001", "000001") verwendet.
Die Texte und die Werte für "xpos" und "ypos" in den diversen "InputBox"-Statements musst Du natürlich wieder Deinen Vorstellungen anpassen.
Grüße
bastla
... der künstliche Startpunkt ...
... wäre Dein "C7765", oder? Da ließe sich vielleicht noch etwas machen :'DynRep.vbs
Const LIMIT = 5
Const PAR = "\par"
Const LOGFILE = "DynRep.log"
sBasePar = "A"
iBasePar = 1
lBaseToken = 1
sDelim = "_"
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
If WScript.Arguments.Count > 0 Then
sArg = WScript.Arguments(0)
If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
sPath = fso.GetFile(sArg).Path
sPath = Left(sPath, InStrRev(sPath, "\") - 1)
Else 'oder ev eines Ordners
If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
Set oFolder = CreateObject("Shell.Application") _
.BrowseForFolder(0, "Ordner wählen", 16, 17)
If TypeName(oFolder) = "Nothing" Then
WScript.Echo "Kein gültiger Ordner angegeben - Script wird beendet!"
WScript.Quit(1)
Else
sPath = oFolder.Self.Path
End If
End If
'Benutzereingaben
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
If bAll Then ' ## Einschränkung auf "Gesamtprojekt" ##
R = InputBox("Vorgabe eines Startwertes gewünscht (J/N)?", "Startwert vorgeben?", "N", xpos, ypos)
If UCase(Left(R, 1)) = "J" Then
Do
'Buchstabe
sBaseParLetter = sBasePar
sMin = "A"
sMax = "Z"
Do
R = UCase(InputBox("Bitte den Buchstaben (" & _
sMin & " - " & sMax & ") eingeben!", "Buchstabe", , xpos, ypos))
If R <> "" Then sBaseParLetter = Left(R, 1)
Loop Until sBaseParLetter >= sMin And sBaseParLetter <=sMax
'Absatznummer
iBaseParNumber = iBasePar
iMin = 0
iMax = 9999
Do
R = InputBox("Bitte den Startwert für die Absatznummer (" & _
CStr(iMin) & " - " & CStr(iMax) & ") eingeben!", "Absatznummer", iBasePar, xpos, ypos)
If R <> "" Then If IsNumeric(R) Then iBaseParNumber = CInt(R)
Loop Until iBaseParNumber >= iMin And iBaseParNumber <= iMax
'Laufende Nummer
lBaseTokenNumber = lBaseToken
lMin = 0
lMax = 999999
Do
R = InputBox("Bitte den Startwert für die laufende Nummer (" & _
CStr(lMin) & " - " & CStr(lMax) & ") eingeben!", "Laufende Nummer", lBaseToken, xpos, ypos)
If R <> "" Then If IsNumeric(R) Then lBaseTokenNumber = CLng(R)
Loop Until lBaseTokenNumber >= lMin And lBaseTokenNumber <= lMax
'Kontrolle
sBase = sBaseParLetter & Right(CStr(10000 + iBaseParNumber), 4) & sDelim & Right(CStr(1000000 + lBaseTokenNumber), 6)
Do
R = InputBox("Bitte eingeben: " & vbCrLF & vbCrLF & _
"J, um " & sBase & " als Startwert zu verwenden, " & vbCrLF & _
"N, um mit dem Standardwert zu starten, oder " & vbCrLF & _
"W, um die Eingabe des Startwertes zu wiederholen.", _
"Startwert bestätigen", "J", xpos, ypos)
sWahl = UCase(Left(R, 1))
Loop Until sWahl = "J" Or sWahl = "N" Or sWahl = "W"
If sWahl = "N" Then
sBaseParLetter = sBasePar
iBaseParNumber = iBasePar
lBaseTokenNumber = lBaseToken
End If
Loop Until sWahl <> "W"
sBasePar = sBaseParLetter
iBasePar = iBaseParNumber
lBaseToken = lBaseTokenNumber
End If
End If '## Einschränkung auf "Gesamtprojekt" ##
sPar = Chr(Asc(sBasePar) - 1)
iPar = 10000 + iBasePar - 1
lToken = 1000000 + lBaseToken
'Logdatei erstellen
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)
'Dateien alphabetisch sortiert einlesen
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
If Not oExec.StdOut.AtEndOfStream Then
aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
'Alle Dateien durchgehen
For Each sFileName In aFiles
If Not bAll Then 'Zählung neu beginnen
sPar = sBasePar
iPar = 10000 + iBasePar
lToken = 1000000 + lBaseToken
iLeer = 0
bLUsed = False
Else
iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
bLUsed = True
End If
'Datei behandeln ...
If sFileName <> "" Then
ProcessFile sPath & "\" & sFileName
'... und protokollieren
oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
Right(CStr(lToken), 6) & " " & sFileName
End If
Next
Else
WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
sPath & _
vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
WScript.Quit(1)
End If
oLog.Close
'WScript.Echo "Ersetzen abgeschlossen."
Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""
Do While Not oTheFile.AtEndOfStream
sInL = oTheFile.ReadLine
If sInL <> PAR Then 'Kein leerer Absatz
If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
'... daher keine Aktion erforderlich.
Else 'LIMIT überschritten -> Buchstabenwechsel, ...
If bLUsed Then '... falls Buchstabe bereits verwendet wurde
If sPar < "Z" Then
sPar = Chr(Asc(sPar) + 1)
Else
sPar = "A"
End If
iPar = iPar + 1
bLUsed = False
End If
End If
iLeer = 0 'Zählung Leerzeilen rücksetzen
'Zeile behandeln
aLine = Split(sInL, sToken, -1, vbTextCompare)
sLine = aLine(0)
For i = 1 To UBound(aLine)
sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
Right(CStr(lToken), 6) & sPost
sLine = sLine & sTag & aLine(i)
lToken = lToken + 1
bLUsed = True
Next
Else 'Leerzeile
iLeer = iLeer + 1
sLine = sInL
End If
If sOut <> "" Then
sOut = sOut & vbCrLF & sLine
Else
sOut = sLine
End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
"Wollen Sie (undankbarer, ahnungsloser, bestenfalls Durchschnittsbenutzer) das (Super-duper-überdrüber-einfachnurtoll-) Programm wirklich (, ganz sicher, jetzt schon, total gnadenlos) beenden?"
belästigt werden und versuche daher, den Benutzern meiner Scripts auch nur die nötigsten Eingaben abzuverlangen ...) Falls Du die Option doch in jedem Fall anbieten willst, musst Du nur die mit '##Einschränkung auf "Gesamtprojekt" ## gekennzeichneten "If"- und "End If"-Zeilen entfernen.Die eingegebenen Informationen werden hinsichtlich des Wertebereiches überprüft. Bei einem Abbruch der Eingabe (eines einzelnen Wertes) wird einfach ohne weitere Rückfrage der jeweilige Standardwert ("A", "0001", "000001") verwendet.
Die Texte und die Werte für "xpos" und "ypos" in den diversen "InputBox"-Statements musst Du natürlich wieder Deinen Vorstellungen anpassen.
Grüße
bastla
Hallo Fraenky!
Vorweg: Da wir hier immer noch im Scripting-Bereich sind, müssen wir damit leben, dass die GUI eher karg ausfällt - eine "schöne" Benutzeroberfläche ist einem VB (welcher Couleur auch immer) oder einem VBA vorbehalten.
Ob die zweimalige zusätzliche Betätigung der Eingabetaste dem Benutzer schwerer fällt, als immer den vollständigen Startwert anzugeben, musst natürlich Du beurteilen - ich war von der Überlegung ausgegangen, dass nur dort, wo eine Abweichung vom Defaultwert (A0001_000001) gewünscht ist, eine Eingabe erfolgen muss - soll also nur die laufende Nummer angegeben werden, musst Du weder den Buchstaben noch die Absatznummer eingeben, sondern kannst die Eingabefelder mit Esc oder der Eingabetaste einfach schließen.
Abgesehen davon finde ich detaillierte Beschreibungen der gewünschten Funktionalität super, besonders wenn sie im Vorhinein erfolgen.
Diese kannst Du zumindest als Defaultwert konstant oder, etwas übersichtlicher, über am Anfang des Scripts festgelegte Variable, in die jeweilige "InputBox" eintragen (3. Parameter, wirst Du ja schon gesehen haben).
Ich lasse jetzt die eingegebenen Parameter auch erst mal in eine Datei rausschreiben (siehe unten) - das Einlesen wirst Du als angehender VBScripter ja vielleicht bald selbst programmieren können ...
Nun wieder zu Realistischem:
Bei fehlerhaften Eingaben will ich Deine User auch nicht mit dem Wegklicken einer Fehlermeldung belasten , daher wird kommentarlos (aber mit Vorgabe des Defaultwertes als Muster einer gültigen Eingabe) die "InputBox" wieder angezeigt. Für den Fall, dass Du Dich an solchen Meldungen versuchen wolltest, habe ich ein Beispiel (als Kommentar) integriert. Allerdings wäre für jeden Fehler (gekennzeichnet durch "bOK = False") eine eigene Meldung auszugeben ...
Ergänzend zu Deinen Vorgaben habe ich eine Liste der erlaubten Trennzeichen vorgesehen (siehe Definitionen am Anfang des Scripts).
Schließlich wird noch eine "Parameter.txt" mit den eingegebenen Parametern erzeugt und von der (um die entsprechende Funktionalität erweiterten) Batch-Datei zum Benennen der Sicherungskopie verwendet:
Diese Version hat übrigens bei mir den Dateinamen "DynRep-Last.vbs/bat" (nicht "DynRep-Latest") - gleich, nach welcher Deiner Berechnungen, wir stehen bei über 100 % und Stachanovismus ist kein Element der Liste meiner Laster ...
Grüße
bastla
P.S.: Eine Bitte: Könntest Du Dich wohl beim Wort "währe" auf die erforderlichen 4 Buchstaben beschränken?
Vorweg: Da wir hier immer noch im Scripting-Bereich sind, müssen wir damit leben, dass die GUI eher karg ausfällt - eine "schöne" Benutzeroberfläche ist einem VB (welcher Couleur auch immer) oder einem VBA vorbehalten.
Ob die zweimalige zusätzliche Betätigung der Eingabetaste dem Benutzer schwerer fällt, als immer den vollständigen Startwert anzugeben, musst natürlich Du beurteilen - ich war von der Überlegung ausgegangen, dass nur dort, wo eine Abweichung vom Defaultwert (A0001_000001) gewünscht ist, eine Eingabe erfolgen muss - soll also nur die laufende Nummer angegeben werden, musst Du weder den Buchstaben noch die Absatznummer eingeben, sondern kannst die Eingabefelder mit Esc oder der Eingabetaste einfach schließen.
Abgesehen davon finde ich detaillierte Beschreibungen der gewünschten Funktionalität super, besonders wenn sie im Vorhinein erfolgen.
...alle über Fenster eingegebenen Parameter entweder intern in einer Startparametersektion abspeichert ...
Diese kannst Du zumindest als Defaultwert konstant oder, etwas übersichtlicher, über am Anfang des Scripts festgelegte Variable, in die jeweilige "InputBox" eintragen (3. Parameter, wirst Du ja schon gesehen haben).
Ich lasse jetzt die eingegebenen Parameter auch erst mal in eine Datei rausschreiben (siehe unten) - das Einlesen wirst Du als angehender VBScripter ja vielleicht bald selbst programmieren können ...
Mann könnte weiterhin als Startparameter die Prozessorauslastung reglementieren.
Dem Manne wünsche ich viel Spaß dabei ... Nun wieder zu Realistischem:
'DynRep-Last.vbs
Const LIMIT = 5
Const PAR = "\par"
Const LOGFILE = "DynRep.log"
Const PARAMFILE = "Parameter.txt"
'Defaultwerte
sBasePar = "A"
iBasePar = 1
lBaseToken = 1
sBaseDelim = "_"
sDelimAccept = "_-#|@" 'zulässige Trennzeichen, bei Bedarf ergänzen
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
If WScript.Arguments.Count > 0 Then
sArg = WScript.Arguments(0)
If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
sPath = fso.GetFile(sArg).Path
sPath = Left(sPath, InStrRev(sPath, "\") - 1)
Else 'oder ev eines Ordners
If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
Set oFolder = CreateObject("Shell.Application") _
.BrowseForFolder(0, "Ordner wählen", 16, 17)
If TypeName(oFolder) = "Nothing" Then
WScript.Echo "Kein gültiger Ordner angegeben - Script wird beendet!"
WScript.Quit(1)
Else
sPath = oFolder.Self.Path
End If
End If
'Benutzereingaben
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
If bAll Then ' ## Einschränkung auf "Gesamtprojekt" ##
Do
'Buchstabe
sBaseParLetter = sBasePar
sMin = "A"
sMax = "Z"
'Absatznummer
iBaseParNumber = iBasePar
iMin = 0
iMax = 9999
'Laufende Nummer
lBaseTokenNumber = lBaseToken
lMin = 0
lMax = 999999
'Delimiter
sBaseDelimChar = sBaseDelim
sBase = sBaseParLetter & Right(CStr(10000 + iBaseParNumber), 4) & sBaseDelimChar & Right(CStr(1000000 + lBaseTokenNumber), 6)
R = InputBox("Startwert entsprechend dem Muster eingeben," & vbCrLF & _
"wobei führende Nullen bei den Nummern weggelassen werden können und" & vbCrLF & _
"das Trennzeichen aus der folgenden Liste stammen muss:" & vbCrLF & _
sDelimAccept, "Startwert", sBase, xpos, ypos)
bOK = True
If R = "" Then
' bei leerer Eingabe oder Abbruch Defaultwerte verwenden, daher keine Änderung erforderlich
Else
If Len(R) >= 2 Then 'mindestens Buchstabe und Trennzeichen könnten eingegeben worden sein
'Buchstaben prüfen
If UCase(Left(R, 1)) >= sMin And UCase(Left(R, 1)) <= sMax Then
sBaseParLetter = UCase(Left(R, 1))
Else
bOK = False
End If
'Ziffer oder Trennzeichen
iDelimPos = 0
For i = 2 To Len(R)
If Not IsNumeric(Mid(R, i, 1)) Then
If InStr(sDelimAccept, Mid(R, i, 1)) Then
sBaseDelimChar = Mid(R, i, 1)
iDelimPos = i
Else
bOK = False
'### Beispiel für Fehlermeldung ###
'MsgBox "Das verwendete Trennzeichen " & Mid(R, i, 1) & " ist nicht zulässig!"
'### Beispiel für Fehlermeldung ###
End If
Exit For
End If
Next
Select Case iDelimPos 'abhängig von Position des Trennzeichens
Case 0, 1 'kein gültiges Trennzeichen enthalten; (1 eigentlich unmöglich)
bOK = False
Case 2 'keine Absatznummer
If iDelimPos < Len(R) Then 'laufende Nummer
If IsNumeric(Mid(R, iDelimPos + 1)) Then
lBaseTokenNumber = CLng(Mid(R, iDelimPos + 1, 6))
Else
bOK = False
End If
End If
Case Len(R) 'Trennzeichen am Ende, daher keine laufende Nummer
If IsNumeric(Mid(R, 2, iDelimPos - 2)) Then
If iDelimPos <= 6 Then
iBaseParNumber = CStr(Mid(R, 2, iDelimPos - 2))
Else
iBaseParNumber = CStr(Mid(R, 2, 4))
End If
Else
bOK = False
End If
Case Else 'Absatznummer und laufende Nummer
If IsNumeric(Mid(R, 2, iDelimPos - 2)) Then
If IsNumeric(Mid(R, iDelimPos + 1)) Then
If iDelimPos <= 6 Then
iBaseParNumber = CInt(Mid(R, 2, iDelimPos - 2))
Else
iBaseParNumber = CInt(Mid(R, 2, 4))
End If
lBaseTokenNumber = CLng(Mid(R, iDelimPos + 1, 6))
Else
bOK = False
End If
Else
bOK = False
End If
End Select
Else
bOK = False
End If
End If
Loop Until bOK
sBasePar = sBaseParLetter
iBasePar = iBaseParNumber
lBaseToken = lBaseTokenNumber
sBaseDelim = sBaseDelimChar
End If '## Einschränkung auf "Gesamtprojekt" ##
sPar = Chr(Asc(sBasePar) - 1)
iPar = 10000 + iBasePar - 1
lToken = 1000000 + lBaseToken
sDelim = sBaseDelim
'Logdatei erstellen
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)
'Dateien alphabetisch sortiert einlesen
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
If Not oExec.StdOut.AtEndOfStream Then
aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
'Alle Dateien durchgehen
For Each sFileName In aFiles
If Not bAll Then 'Zählung neu beginnen
sPar = sBasePar
iPar = 10000 + iBasePar
lToken = 1000000 + lBaseToken
iLeer = 0
bLUsed = False
Else
iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
bLUsed = True
End If
'Datei behandeln ...
If sFileName <> "" Then
ProcessFile sPath & "\" & sFileName
'... und protokollieren
oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
Right(CStr(lToken), 6) & " " & sFileName
End If
Next
Else
WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
sPath & _
vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
WScript.Quit(1)
End If
oLog.Close
'Parameter speichern (für Verabeitung in Batch wichtig: sToken in letzte Zeile schreiben)
fso.OpenTextFile(sPath & "\" & PARAMFILE, 2, True).Write _
sPre & vbCrLF & sPost & vbCrLF & bAll & vbCrLf & sToken
Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""
Do While Not oTheFile.AtEndOfStream
sInL = oTheFile.ReadLine
If sInL <> PAR Then 'Kein leerer Absatz
If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
'... daher keine Aktion erforderlich.
Else 'LIMIT überschritten -> Buchstabenwechsel, ...
If bLUsed Then '... falls Buchstabe bereits verwendet wurde
If sPar < "Z" Then
sPar = Chr(Asc(sPar) + 1)
Else
sPar = "A"
End If
iPar = iPar + 1
bLUsed = False
End If
End If
iLeer = 0 'Zählung Leerzeilen rücksetzen
'Zeile behandeln
aLine = Split(sInL, sToken, -1, vbTextCompare)
sLine = aLine(0)
For i = 1 To UBound(aLine)
sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
Right(CStr(lToken), 6) & sPost
sLine = sLine & sTag & aLine(i)
lToken = lToken + 1
bLUsed = True
Next
Else 'Leerzeile
iLeer = iLeer + 1
sLine = sInL
End If
If sOut <> "" Then
sOut = sOut & vbCrLF & sLine
Else
sOut = sLine
End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
Ergänzend zu Deinen Vorgaben habe ich eine Liste der erlaubten Trennzeichen vorgesehen (siehe Definitionen am Anfang des Scripts).
Schließlich wird noch eine "Parameter.txt" mit den eingegebenen Parametern erzeugt und von der (um die entsprechende Funktionalität erweiterten) Batch-Datei zum Benennen der Sicherungskopie verwendet:
@echo on & setlocal
if not exist %1 goto :eof
cd /d "%~f1" 2>nul || cd /d "%~dp1"
set "Bak=Sicherung"
set "Param=Parameter.txt"
set "List=DR.lst"
set /a Nr=1001
set Datum=%date:~-4%-%date:~-7,2%-%date:~-10,2%
if not exist "%Bak%" md "%Bak%"
if exist "%List%" del "%List%"
for /f "delims=" %%i in ('dir /b /on /a-d *.rtf') do call :ProcessFile "%%i"
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do copy "%%j" "%Bak%\%%j" & ren "%%j" %%i.rtf &
C:\Skripts\DynRep-Last.vbs "%cd%"
if exist "%Param%" for /f "usebackq delims=" %%i in ("%Param%") do set "Token=%%i"
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist "%Bak%\%%j" move "%Bak%\%%j" "%Bak%\%%~nj_%Datum%_%Token%%%~xj"
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist %%i.rtf move %%i.rtf "%%i_%%j"
pause
goto :eof
:ProcessFile
(echo %Nr:~-3%=%~1)>>"%List%"
set /a Nr+=1
goto :eof
Grüße
bastla
P.S.: Eine Bitte: Könntest Du Dich wohl beim Wort "währe" auf die erforderlichen 4 Buchstaben beschränken?
Hallo Fraenky!
Ich weiß nicht, ob ich Dich richtig verstanden habe, aber wenn Du wirklich oft den Pfad zu einem bestimmten Ordner benötigst, kannst Du sehr einfach eine Verknüpfung oder eine eigene Batchdatei zum Aufruf der "DynRep.bat" erstellen, um den Pfad zu übergeben (da die Batchdatei ja sowohl Ordner-, als auch Dateiangaben als Starparameter akzeptiert, genügt der Pfad zum Ordner, den Du einfach aus der Adresszeile des Explorers kopieren kannst) - Beispiel einer solchen "Projekt-XYZ-Start.bat":
Verlangen - nein, Motivation - ?
Aber na gut, die entsprechenden Zeilen würden etwa lauten:
Danach stehen wieder die gespeicherten Werte in den entsprechenden Variablen. Wenn Du diesen Programmteil nach einer entsprechenden Benutzereingabe ("Gespeicherte Parameter laden (J/N)?") - und die möchte ich Dir sehr wohl zutrauen - als Alternative zu den Benutzereingaben vor der Zeile "If bAll Then" einbaust, hast Du wieder ein Mosaiksteinchen mehr für Deine Nahezu-200%-Lösung ...
Zusätzliche Trennzeichen einfach innerhalb der Anführungszeichen in der Zeile
hinzufügen ...
Als Hinweis für alle weiteren Projekte: Ohne vernünftige Testdaten (und davon hast Du hier überhaupt keine geliefert) Lösungen zu erstellen ist, zurückhaltend formuliert, etwas mühsam.
Speziell hinsichtlich der Sonderzeichenproblematik ist die Situation für mich einerseits Neuland, andererseits, mangels abzusehenden zukünftigen eigenen Bedarfs an einer Lösung, auch nicht übermäßig motivierend. Gefunden werden kann von dem Script nur, was mit den gleichen Zeichen (abgesehen von Groß-/Kleinschreibung) in der Textdatei steht - demzufolge musst Du mit einem beliebigen Texteditor (und sei es notepad.exe) die Schreibweise in der rtf-Datei untersuchen und entsprechend die Eingabe des Suchbegriffes anpassen.
Um es abschließend nochmals deutlich zu sagen: Die aktuelle Version des Scripts ist für mich "feature-complete", daher werde ich noch enthaltene Fehler zu korrigieren versuchen, aber keine Erweiterungen mehr vornehmen.
Grüße
bastla
...alle über Fenster eingegebenen Parameter entweder intern in einer Startparametersektion abspeichert ...
Dazu gehören auch die Pfadangaben des Arbeitsordners. Gerade bei tiefen Ordnerstrukturen besonders wichtig.C:\Skripts\DynRep.bat D:\Wirklich\ganz\besonders\tief\vergrabener\Arbeitsordner\XYZ
Ich lasse jetzt die eingegebenen Parameter auch erst mal in eine Datei rausschreiben (siehe unten) - das Einlesen wirst Du als angehender VBScripter ja vielleicht bald selbst programmieren können ...
Da solltest Du nicht zu schnell zu viel von mir verlangen.Aber na gut, die entsprechenden Zeilen würden etwa lauten:
Set oParam = fso.OpenTextFile(sPath & "\" & PARAMFILE, 1)
sPre = oParam.ReadLine
sPost = oParam.ReadLine
bAll = oParam.ReadLine
sToken = oParam.ReadLine
oParam.Close
Ergänzend zu Deinen Vorgaben habe ich eine Liste der erlaubten Trennzeichen vorgesehen siehe Definitionen am Anfang des Scripts).
Kann ich diese Liste erweitern?sDelimAccept = "_-#|@" 'zulässige Trennzeichen, bei Bedarf ergänzen
In meinem html editor ist Coração im Quelltext mit Coração darbestellt, die gleichnamige Datei dagegen lautet Cora%E7%E3o.php.
Eigentlich waren wir bei rtf-Dateien ...Als Hinweis für alle weiteren Projekte: Ohne vernünftige Testdaten (und davon hast Du hier überhaupt keine geliefert) Lösungen zu erstellen ist, zurückhaltend formuliert, etwas mühsam.
Speziell hinsichtlich der Sonderzeichenproblematik ist die Situation für mich einerseits Neuland, andererseits, mangels abzusehenden zukünftigen eigenen Bedarfs an einer Lösung, auch nicht übermäßig motivierend. Gefunden werden kann von dem Script nur, was mit den gleichen Zeichen (abgesehen von Groß-/Kleinschreibung) in der Textdatei steht - demzufolge musst Du mit einem beliebigen Texteditor (und sei es notepad.exe) die Schreibweise in der rtf-Datei untersuchen und entsprechend die Eingabe des Suchbegriffes anpassen.
Um es abschließend nochmals deutlich zu sagen: Die aktuelle Version des Scripts ist für mich "feature-complete", daher werde ich noch enthaltene Fehler zu korrigieren versuchen, aber keine Erweiterungen mehr vornehmen.
Grüße
bastla
Hallo Fraenky!
Die "Parameter.txt" habe ich einerseits zu Demozwecken und andererseits zur Rückgabe des Suchbegriffes an die Batchdatei, wo ich diesen zum Umbenennen der Sicherungsdatei verwende, erstellt.
Grüße
bastla
Ja aber wofür haben wir denn die Parameter.txt erstellt. Da stehen jetzt nur wahr und Markierung drin. Alles an seinem Platz. Ich habe einen Arbeitsorder und den muß ich doch nicht jedes mal auswälen, dafür haben Wir doch die Parameter.txt.
Wenn Du überhaupt nur einen Arbeitsordner hast, stellt sich die Frage nach einem Abspeichern des Pfades noch weniger - dann schreibe ich diesen Ordner in die "DynRep.bat", anstatt dort den Pfad zu ermitteln und das war's.Die "Parameter.txt" habe ich einerseits zu Demozwecken und andererseits zur Rückgabe des Suchbegriffes an die Batchdatei, wo ich diesen zum Umbenennen der Sicherungsdatei verwende, erstellt.
Das Script kann weder Dateien mit Sonderzeichen öffnen:
Das muss es nicht können, da (bis auf die Nummerierung, die ich im Dateinamen auch weglassen kann) durch die Batchdatei nach den Ersetzungen der ursprüngliche Name der rtf-Datei wieder hergestellt wird. Zur Ursache: CMD verwendet ASCII, VBS (Windows) aber ANSI - die Unterschiede in der Codierung wirken sich aber erst ab Position 128 des Zeichensatzes (wo eben auch die diversen nicht-englischen/amerikanischen Sonderzeichen untergebracht sind) aus.Noch kann das Script im Text Sonderzeichen als Markierung erkennen. Das ist beim durchzählen einzelner Wörter interessant, um die Gewichtung festzustellen.
Diesem Argument kann ich nicht folgen - wie bereits erwähnt, suche in der Datei nach der entsprechenden Stelle (nicht mit einem Programm, das rtf-Dateien importiert/nativ öffnet, sondern mit einem Texteditor) und gib diesen Text in der selben Schreibweise als Markierung ein.Sind Felder nicht entsprechend deklariert oder für diesen Typ Daten ungünstige Befehle verwendet worden?
Vielleicht fragst Du das jemanden, der sich damit auskennt ...Dann müßten die Sonderzeichen für die Bearbeitung durch die Zuordnungen ersetzt werden und nach der Bearbeitung, z.B. einer Abfrage o.ä. wieder in Originalzustand gebracht werden.
... was einer Vorgangsweise entspricht, die Du hinsichtlich der Dateinamen offensichtlich nicht goutierst ...Grüße
bastla
Hallo Fraenky!
Damit könntest Du die Batchdatei per direktem Doppelklick mit dem Standard-Arbeitsordner "D:\Dein\Arbeitsordner" starten oder, wie gehabt, etwa per "Senden an" ganz einfach einen anderen Arbeitsordner übergeben ...
Im Script könntest Du analog dazu den Teil
auf die eine Zeile
reduzieren - dann bist Du allerdings selbst dafür verantwortlich, dass dieser Pfad existiert (was eben bisher durch den (jetzt eliminierten) Ordnerauswahl-Dialog - das Thema kommt mir irgendwie bekannt vor - sichergestellt werden sollte - auch, wenn zuletzt bereits die Batchdatei dafür sorgte, dass ein gültiger Pfad übergeben wurde, wodurch Du diesen Dialog schon lange nicht zu Gesicht bekommen haben dürftest).
Hinsichtlich der Batch-Datei ist anzumerken, dass sich Dateiverwaltungsaufgaben in den meisten Fällen per Batch wesentich weniger aufwändig erledigen lassen - ua daher der Einsatz dieses Werkzeuges. Da das Erscheinungsbild eines VBScripts ja auch nicht von allergrößter Eleganz geprägt ist, kann ich mit dem (zugegeben nicht ganz dezenten) CMD-Fenster eigentlich recht gut leben ...
Grüße
bastla
Kann ich den Pfag auch ins Script selbst einfügen, wenn ich keine Sonderzeichen im Dateinamen verwendet werden und wenn ja wie und wo?
Besser wäre es, die Batch-Zeilen 2 und 3 durch folgende Zeilen zu ersetzen:cd /d "D:\Dein\Arbeitsordner"
if exist %1 cd /d "%~f1" 2>nul || cd /d "%~dp1"
Im Script könntest Du analog dazu den Teil
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
Set oFolder = CreateObject("Shell.Application") _
.BrowseForFolder(0, "Ordner wählen", 16, 17)
If TypeName(oFolder) = "Nothing" Then
WScript.Echo "Kein gültiger Ordner angegeben - Script wird beendet!"
WScript.Quit(1)
Else
sPath = oFolder.Self.Path
End If
End If
If sPath = "" Then sPath = "D:\Dein\Arbeitsordner" ''Kein (gültiger) Pfad übergeben, daher Standard-Arbeitsordner verwenden
Hinsichtlich der Batch-Datei ist anzumerken, dass sich Dateiverwaltungsaufgaben in den meisten Fällen per Batch wesentich weniger aufwändig erledigen lassen - ua daher der Einsatz dieses Werkzeuges. Da das Erscheinungsbild eines VBScripts ja auch nicht von allergrößter Eleganz geprägt ist, kann ich mit dem (zugegeben nicht ganz dezenten) CMD-Fenster eigentlich recht gut leben ...
Währe da nicht ein Befehl sinnvoll, etwa wie transform data field von ANSI nach ASCI, um entsprechende Bearbeitungen durchführen zu können ?
Da ich wusste, wie ich ohne allzu großen Aufwand in Batch um dieses Problem "herumprogrammieren" kann, habe ich mich für die aktuelle Lösung entschieden - VBS selbst bietet nämlich keine vorgefertigte Funktion für diesen Zweck.Was irgenwie meinem Wiederwillen entspringt, wo ich doch ein Script einsetze, noch etwas zweites einzusetzen ...
... kann ich zwar grundsätzlich nachvollziehen, aber: siehe oben. Und: Egal, ob Du Windows 2000, XP oder Vista einsetzt, CMD hast Du auf jeden Fall zur Verfügung, sodass die Lösung relativ einfach auf andere Rechner übertragbar ist - mit anderen Worten, es hätte - bedingt durch den vielleicht notwendigen Einsatz eines externen Tools - ja auch noch schlimmer kommen können (zugegeben, ein schwacher Trost ).Grüße
bastla
Hallo Fraenky!
Ansonsten findest Du zu "Run" eine Menge Information und Beispiele im Web ...
Grüße
bastla
Ist VBS auf allen Servern einsetzbar, oder, so verstehe ich das bis jetzt, nur unter Windows generell, soll heißen, läuft ein .vbs auch auf Lynux?
Läuft nur unter Windows.Wie binde ich ein .vbs in den html code ein oder rufe es vom Server auf?
Wie ein JavaScript; direkt vom Server starten lässt es sich wie eine ".exe"-Datei (indem Du das Script quasi als Befehl, etwa auch in einer Verknüpfung, verwendest, zB \\Server\Share\Script.vbs) oder mit Angabe des zu verwendenden Interpreters "wscript" oder "cscript" (letzterer ist die Kommandozeilenversion, um das Script ohne grafische Oberfläche zB aus einem Batch aufzurufen - Beispiel: cscript //nologo \\Server\Share\Script.vbs)Wie rufe ich aus einem .vbs eine ,bat auf?
Im einfachsten Fall so:WScript.CreateObject("WScript.Shell").Run "C:\Skripts\Test.bat"
Dann hätten Wir die Gelegenheit gehabt, zu zeigen, das Wir nicht nur die länste Postingfolge auf administrator.de hinkriegen, sondern, gemessen an der Komplexität, auch die kürzeste.
Ich habe meinen diesbezüglichen Ehrgeiz recht gut im Griff ... Grüße
bastla