Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Mit Batch Datei Markierung in rtf doks finden( VB Script auch OK)

Mitglied: Fraenky

Fraenky (Level 1) - Jetzt verbinden

21.08.2007, aktualisiert 30.08.2007, 9344 Aufrufe, 31 Kommentare

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
31 Antworten
Mitglied: bastla
21.08.2007 um 11:43 Uhr
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,
  • 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
Bitte warten ..
Mitglied: Fraenky
21.08.2007 um 12:46 Uhr
Hallo bastla.
Danke für Dein schnelles Einsteigen.
Ja, jedes "zzzh1" soll ersetzt werden, wobei dieses Markierungszeichen beim Starten der Batch dat abgefragt werden sollte und bis zu 10 Zeichen lang sein können könnte.
Der Buchstabe sollte bei A beginnen . Wenn Absätze > Anz Buchstaben beginne bei A. Wir können aber einen zweiten Zähler einbauen für die absolute Anzahl Absätze, dann hätten Wir das Format
C9999Z999999, wobei der erste Buchstabe dynamisch wechselt, die erste Zahlengruppe die Anzahl der Absätze darstellt, das Z einfach ein Trennzeichen ist und die zweite Zahlengruppe die Anzahl der Markierungen wiedergiebt. Die dargestellten Zahlengrößen dürften die größte Ausdehnung wiederspiegeln, also mehr als 9999 Abdätze werden nicht erwartet, ebenfalls nicht mehr als 999999 Fundstellen der Markierung.
Den Ablauf stelle ich mir wie folgt vor:
Arbeitsordner ist der Ordner, in dem die Batch liegt.
Nach starten der Stapelverarbeitungsdatei Abfrage:
Bitte Markierungszeichen eingeben: Eingabe
Sollen alle RTF doks im Ordner als ein Projekt gelten J/N
Wenn J die verschiedenen doks im Ordner in alphabetischer Rheienfolge öffnen, die Markierungen ersetzen und das öffnen einer neuen Datei wie einen Absatz behandeln, wobei die Zahlenwerte dokumentübergreifend weitergezählt werden sollen.
Bei N jedes Dokument als eigenes Projekt behandeln, also Zahlenwerte auf Anfang A0001Z000001
Abfrage: Künstlichen Startwert eingeben? J/N Bei J Eingabe z.B G5542Z002335
Abfrage Präfix J/N Bei J Eingabe
für Komentare vor der dynamischen Ersetzung
Abfrage Postfix J/N Bei J Eingabe // für Komentare nach der dynamischen Ersetzung
So, jetzt sollte es etwas klarer geworden sein.
Gruß Fränky
Bitte warten ..
Mitglied: bastla
21.08.2007 um 16:46 Uhr
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:
01.
A0001Z000001
02.
A0001Z000002
03.
A0001Z000003
04.
A0001Z000004
05.
B0002Z000005
06.
B0002Z000006
07.
C0003Z000007
08.
C0003Z000008
09.
C0003Z000009
10.
C0003Z000010
11.
C0003Z000011
12.
...
13.
F0032Z000294
14.
F0032Z000295
15.
G0033Z000296
16.
...
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
01.
\par
beinhaltet)?

Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
21.08.2007 um 19:16 Uhr
Hallo Bastla.
Danke für Dein Engagement.
Deinen gemachten Unterschied zwischen Zählen der Absätze und Absatzblöcke kennzeichenen verstehe ich nicht. Auf jeden Fall entsprechen Deine dynamichen Ersetzungen genau meinen Vorstellungen. Der erste Buchstabe wechselt bei jedem Absatz, was die Orientierung bei kleineren Projekten bewahrt und die Absatze mit Fundstelle der Markierung werden gezählt. So wie Du das dargestellt hast, ist das genau richtig. Die Fundstellen der Markierung werden kontinuirlich gezählt. Als Bezeichnung dafür würde ich "dynamische Ersetzung" wählen = A0001_000004. Bei dem Einwand mit dem Unterstrich kann ich mich nur anschließen. Erleichtert das Erkennen und die Übersichtlichkeit sehr. Die Auswertung erfolgt optisch, das heist, das die letzte dynamische Ersetzung das Ergebnis, die Relevanz dieser Markierung, aufzeigt, aber genauso jeder zufällige Schnitt ins Dokument die Relevanz aufzeigt mit der Zusatzinfo der betroffenen Absätze.
Wie eine leere Zeile im rtf Format auf der Programierebene aussieht, kann ich Dir nicht sagen, optisch ist sie einfach leer. Im Gegensatz zum normalen txt Format bedeutet rtf ritch text format also reiches text format, was einfach nur einige zudätzliche Formartierungsmöglichkeiten eröffnet. Also wird da wohl kein großer Unterschied zum txt Format bzgl leerer Absätze sein.
Die Markierungen im Text werden von Hand eingefügt und in der Auswertung vom Programm ersetzt. Danke soweit
Fränky
Bitte warten ..
Mitglied: bastla
21.08.2007 um 21:21 Uhr
Hallo Fraenky!

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
Bitte warten ..
Mitglied: Fraenky
21.08.2007 um 21:38 Uhr
Hallo Bastla.
OK. Die Absätze innerhalb der Absatzblöcke sind hier für mich unerheblich. Die verschiedenen Informationseinheiten sind durch mindestens 5 Leerzeilen getrennt. Falls Du Schwierigkeiten hast, im rtf format leere Zeilen zu erkennen, also die Abwesenheit von Text, könnte ich notfalls die Infos für die Bearbeitung ins .txt Format konvertieren. Hast Du den schon ein paar Zeilen gestrickt, so das ich schon mal was ausprobieren kann?
Gruß Fränky
Bitte warten ..
Mitglied: Fraenky
22.08.2007 um 11:36 Uhr
Hallo Bastla.
Habe die Problematik bezüglich der Leerzeilen nochmal gechekt. Wir können ja beide Zustände als neuen Absatzblock definieren. Entweder mindestens 5 mal total leer Zeile oder fünf mal \par = neuer Absatzblock = Buchstabe rauf und +1 beim Zähler der Absatzblöcke.
Gruß
Fränky
Bitte warten ..
Mitglied: bastla
22.08.2007 um 21:13 Uhr
Hallo Fraenky!

Machmal dauert's lang, dann wieder länger ...

Jetzt hätte ich aber etwas zum Testen für Dich:
01.
'DynRep.vbs
02.
Const LIMIT = 5
03.
Const PAR = "\par"
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject")
06.
Set objShell = CreateObject("WScript.Shell")
07.
 
08.
If WScript.Arguments.Count > 0 Then
09.
	sArg = WScript.Arguments(0)
10.
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
11.
		sPath = fso.GetFile(sArg).Path
12.
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)
13.
	Else 'oder ev eines Ordners
14.
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
15.
	End If
16.
End If
17.
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
18.
	Set oFolder = CreateObject("Shell.Application") _
19.
		.BrowseForFolder(0, "Ordner wählen", 16, 17)
20.
	If TypeName(oFolder) = "Nothing" Then
21.
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"
22.
		WScript.Quit(1)
23.
	Else
24.
		sPath = oFolder.Self.Path
25.
	End If
26.
End If
27.
 
28.
'Benutzereingaben
29.
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
30.
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
31.
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
32.
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
33.
 
34.
sPar = "@"
35.
iPar = 10000
36.
sDelim = "_"
37.
lToken = 1000000
38.
iLeer = 0
39.
 
40.
'Dateien alphabetisch sortiert einlesen
41.
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d " & sPath & "\*.rtf")
42.
If Not oExec.StdOut.AtEndOfStream Then
43.
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
44.
	'Alle Dateien durchgehen
45.
	For Each sFileName In aFiles
46.
		If Not bAll Then 'Zählung neu beginnen
47.
			sPar = "A"
48.
			iPar = 10001
49.
			lToken = 1000000
50.
			iLeer = 0
51.
		Else
52.
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
53.
		End If
54.
		'Datei behandeln
55.
		If sFileName <> "" Then ProcessFile sPath & "\" & sFileName
56.
	Next
57.
Else
58.
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
59.
		sPath & _
60.
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
61.
	WScript.Quit(1)
62.
End If
63.
WScript.Echo "Ersetzen abgeschlossen."
64.
 
65.
Sub ProcessFile(sFile)
66.
Set oTheFile = fso.OpenTextFile(sFile, 1)
67.
sOut = ""
68.
Do While Not oTheFile.AtEndOfStream
69.
	sInL = oTheFile.ReadLine
70.
	If sInL <> PAR Then 'Kein leerer Absatz
71.
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
72.
			'... daher keine Aktion erforderlich.
73.
		Else 'LIMIT überschritten -> Buchstabenwechsel
74.
			If sPar < "Z" Then
75.
				sPar = Chr(Asc(sPar) + 1)
76.
			Else
77.
				sPar = "A"
78.
			End If
79.
			iPar = iPar + 1
80.
		End If
81.
		iLeer = 0 'Zählung Leerzeilen rücksetzen
82.
 
83.
		'Zeile behandeln
84.
		aLine = Split(sInL, sToken, -1, vbTextCompare)
85.
		sLine = aLine(0)
86.
		For i = 1 To UBound(aLine)
87.
			lToken = lToken + 1
88.
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
89.
				Right(CStr(lToken), 6) & sPost
90.
			sLine = sLine & sTag & aLine(i)
91.
		Next
92.
	Else 'Leerzeile
93.
		iLeer = iLeer + 1
94.
		sLine = sInL
95.
	End If
96.
 
97.
	If sOut <> "" Then
98.
		sOut = sOut & vbCrLF & sLine
99.
	Else
100.
		sOut = sLine
101.
	End If
102.
Loop
103.
oTheFile.Close
104.
'Neuen Dateiinhalt schreiben
105.
fso.OpenTextFile(sFile, 2, True).Write sOut
106.
End Sub
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:
01.
C:\Scripts\DynRep.vbs D:\Projekte\Demo
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
Bitte warten ..
Mitglied: Fraenky
22.08.2007 um 22:32 Uhr
Hallo Bastla.
Nach Bastelei sieht Deine beeindruckende Arbeit nicht aus. Für mich als nichtkundigen der Fremdsprache VB verwunderlich, das Du das so schnell hin bekommen hast. Aber mein Eindruck, hier auf administrator.de es mit Profis tuen zu haben. hat sich bestätigt.
Ich habe den Code mit dem Editor unter DynRep.vbs abgespeichert und eine Testdatei auf die .vbs gezogen und nichts pasierte. Brauche ich da irgendwelche Vorraussetzungen, Biblioteken oder ähnliches, um das Programm zum laufen zu bekommen? Leider habe ich im konkreten Programierbereich fast keine Erfahrungen, so das Du da bei mir nicht alzuviel vorraussetzen solltest. Leider kann ich jetzt noch nichts über den Funktionsumfang sagen.
Also bis hierhin Danke
Gruß Fränky
Bitte warten ..
Mitglied: bastla
22.08.2007 um 22:47 Uhr
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 ...
Bitte warten ..
Mitglied: Fraenky
22.08.2007 um 23:00 Uhr
Hallo Bastla.
Die Datei wird im Explorer als VB Script Script File angeführt. Das ist also in Ordnung.
Wenn ich eine Testdatei auf diese ziehe, öffnet sich mein für die standartmäßige Öffnung dieses Dateityps zuständiger Editor und mehr passiert nicht.
Gruß Fränky
Bitte warten ..
Mitglied: bastla
22.08.2007 um 23:08 Uhr
Hallo Fraenky!

Falls VBScript bei Dir nicht deaktiviert ist, sollte das Script zumindest durch Doppelklick zu starten sein. Ansonsten kannst Du es auch noch von der Kommandozeile mit
01.
wscript //nologo "Scriptpfad\DynRep.vbs"
versuchen.

Grüße
bastla
Bitte warten ..
Mitglied: bastla
22.08.2007 um 23:19 Uhr
... übrigens, bevor das Script dann wirklich läuft:

Entsprechend Deinen Vorgaben arbeitet es ordnerbezogen - es wird also nicht nur eine einzelne übergebene Testdatei verändert, sondern alle rtf-Dateien des zugehörigen Ordners!

Grüße
bastla
Bitte warten ..
Mitglied: Fraenky
22.08.2007 um 23:26 Uhr
Hallo Bastla.
Von der Kommandozeile aus tut sich etwas. Die einzelnen Abfragen finden in etwas wild auftauchenden Fenstern statt. Das war wohl der von Dir für mich gelassene Feinschliff. So weit so gut. Leider bekomme ich in der weiteren Ausführung die Fehlermeldung Zeile 66 Zeichen 1
Fehler: Die Datei wurde nicht gefunden.Code 800AD035 Laufzeitfehler in Microsoft VBScript Du hast da ja sicher den besseren Durchblick. Könntest Du bei der Überarbeitung auch die Funktionsfähigkeit bei den anderen Aktivierungsmethoden nochmal nachbessern? Datei auf Skriptdatei ziehen usw.
Gruß Fränky
Bitte warten ..
Mitglied: bastla
23.08.2007 um 00:01 Uhr
Hallo Fraenky!

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):
01.
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung",, xpos, ypos)
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.

... 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 durch
01.
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
zu ersetzen.

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
Bitte warten ..
Mitglied: Fraenky
23.08.2007 um 00:39 Uhr
Hallo Bastla.
Die verschiedenen Öffnungsmethoden fünktionieren bei mir auch, wenn ich als Admin bei mir angemeldet bin. Das ist also in Ordnung.
Die Positionsbestimmung funktioniert auch, bis auf Zeile 30:
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo,, 100 , 100 ) = vbYes Then bAll = True
Dieses Fenster öffnet unten rechts.

Der Pfad zu meinem Testordner lautet: c:\skript\DynRep.vbs
Da ist also kein Leerzeichen zu erkennen, also war das nicht die Ursache für die Fehlermeldung.
Ah, jetzt habe ich es. Die Dateinamen der RTF Doks enthalten portugisische Sonderseichen. Bei umbennenen auf a.rtf funktioniert es. Kannst Du das noch abfangen? Wenn Du mir einmal den Ort und das Schema zeigst, kann ich die Sonderzeichen selber zusammentragen, falls ein einzelnes bekanntmachen der Sonderzeichen nötig ist.
Vorteilhaft währe es auch, wenn der Arbeitsordner tief versachachtelt liegt, diesen Pfad zu speichern und ihn bei der Pfadauswahl automatisch vorzuschlagen.
Super Bastla
Danke
Fränky
Bitte warten ..
Mitglied: bastla
23.08.2007 um 11:14 Uhr
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:
01.
C0003_000009 001.rtf
02.
G0007_000028 002.rtf
03.
...
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):
01.
@echo off & setlocal
02.
if not exist %1 goto :eof
03.
cd /d "%~f1" 2>nul || cd /d "%~dp1"
04.
echo Bearbeite Dateien in %cd% ...
05.
set "List=DR.lst"
06.
set /a Nr=1001
07.
if exist "%List%" del "%List%"
08.
for /f "delims=" %%i in ('dir /b /on /a-d *.rtf') do call :ProcessFile "%%i"
09.
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do ren "%%j" %%i.rtf
10.
echo Script wird gestartet ...
11.
C:\Skripts\DynRep.vbs "%cd%"
12.
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist %%i.rtf ren %%i.rtf "%%i_%%j"
13.
goto :eof
14.
:ProcessFile
15.
(echo %Nr:~-3%=%~1)>>"%List%"
16.
set /a Nr+=1
17.
goto :eof
Der Scriptcode sieht (vorbehaltlich Deiner Änderungen bei den "InputBox"-Anweisungen) jetzt so aus:
01.
'DynRep.vbs
02.
Const LIMIT = 5
03.
Const PAR = "\par"
04.
Const LOGFILE = "DynRep.log"
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject")
07.
Set objShell = CreateObject("WScript.Shell")
08.
 
09.
If WScript.Arguments.Count > 0 Then
10.
	sArg = WScript.Arguments(0)
11.
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
12.
		sPath = fso.GetFile(sArg).Path
13.
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)
14.
	Else 'oder ev eines Ordners
15.
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
16.
	End If
17.
End If
18.
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
19.
	Set oFolder = CreateObject("Shell.Application") _
20.
		.BrowseForFolder(0, "Ordner wählen", 16, 17)
21.
	If TypeName(oFolder) = "Nothing" Then
22.
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"
23.
		WScript.Quit(1)
24.
	Else
25.
		sPath = oFolder.Self.Path
26.
	End If
27.
End If
28.
 
29.
'Benutzereingaben
30.
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
31.
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
32.
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
33.
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
34.
 
35.
sPar = "@"
36.
iPar = 10000
37.
sDelim = "_"
38.
lToken = 1000000
39.
iLeer = 0
40.
 
41.
'Logdatei erstellen
42.
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)
43.
 
44.
'Dateien alphabetisch sortiert einlesen
45.
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
46.
If Not oExec.StdOut.AtEndOfStream Then
47.
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
48.
	'Alle Dateien durchgehen
49.
	For Each sFileName In aFiles
50.
		If Not bAll Then 'Zählung neu beginnen
51.
			sPar = "A"
52.
			iPar = 10001
53.
			lToken = 1000000
54.
			iLeer = 0
55.
			bLUsed = False
56.
		Else
57.
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
58.
			bLUsed = True
59.
		End If
60.
		'Datei behandeln ...
61.
		If sFileName <> "" Then
62.
			ProcessFile sPath & "\" & sFileName
63.
			'... und protokollieren
64.
			oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
65.
				Right(CStr(lToken), 6) & " " & sFileName
66.
		End If
67.
	Next
68.
Else
69.
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
70.
		sPath & _
71.
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
72.
	WScript.Quit(1)
73.
End If
74.
oLog.Close
75.
'WScript.Echo "Ersetzen abgeschlossen."
76.
 
77.
Sub ProcessFile(sFile)
78.
Set oTheFile = fso.OpenTextFile(sFile, 1)
79.
sOut = ""
80.
Do While Not oTheFile.AtEndOfStream
81.
	sInL = oTheFile.ReadLine
82.
	If sInL <> PAR Then 'Kein leerer Absatz
83.
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
84.
			'... daher keine Aktion erforderlich.
85.
		Else 'LIMIT überschritten -> Buchstabenwechsel, ...
86.
			If bLUsed Then '... falls Buchstabe bereits verwendet wurde
87.
				If sPar < "Z" Then
88.
					sPar = Chr(Asc(sPar) + 1)
89.
				Else
90.
					sPar = "A"
91.
				End If
92.
				iPar = iPar + 1
93.
				bLUsed = False
94.
			End If
95.
		End If
96.
		iLeer = 0 'Zählung Leerzeilen rücksetzen
97.
 
98.
		'Zeile behandeln
99.
		aLine = Split(sInL, sToken, -1, vbTextCompare)
100.
		sLine = aLine(0)
101.
		For i = 1 To UBound(aLine)
102.
			lToken = lToken + 1
103.
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
104.
				Right(CStr(lToken), 6) & sPost
105.
			sLine = sLine & sTag & aLine(i)
106.
			bLUsed = True
107.
		Next
108.
	Else 'Leerzeile
109.
		iLeer = iLeer + 1
110.
		sLine = sInL
111.
	End If
112.
 
113.
	If sOut <> "" Then
114.
		sOut = sOut & vbCrLF & sLine
115.
	Else
116.
		sOut = sLine
117.
	End If
118.
Loop
119.
oTheFile.Close
120.
'Neuen Dateiinhalt schreiben
121.
fso.OpenTextFile(sFile, 2, True).Write sOut
122.
End Sub
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:
01.
R = InputBox("Alle Dateien als Gesamtprojekt betrachten (J/N)?", "Gesamtprojekt", "J", xpos, ypos)
02.
If UCase(Left(R, 1)) = "J" Then bAll = True
Nur bei Eingabe einer mit "J" oder "j" beginnenden Antwort wird über alle Dateien fortlaufend nummeriert.

Abschließend noch die "RestoreFileNames"-Batchdatei:
01.
@echo off & setlocal
02.
if not exist %1 goto :eof
03.
cd /d "%~f1" 2>nul || cd /d "%~dp1"
04.
set "List=DR.lst"
05.
if not exist "%List%" goto :eof
06.
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist "%%i_%%j" ren "%%i_%%j" "%%j"
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
Bitte warten ..
Mitglied: Fraenky
23.08.2007 um 17:05 Uhr
Bravo, Aplause, Unglaublich, es läuft, funktioniert, kaum zu glauben, diese Elegance, springt durch die Dateien und macht, was Wir definiert haben und was Du Bastla, mit Geduld und Sachverstand in diese Fremdsprache der Maschienen übersetzt hast. 100 Punkte, nein 99, weil der künstliche Startpunkt nicht ungesetzt wurde. Dafür aber die Hürde mit den Fremdzeichen genommen wurde. Erstklassig, nur zu empfehlen der Service auf administrator.de. Eigentlich wollte ich ja was über die Programmierung lernen, aber dafür scheint mir dieses Script wegen der Komplexität nicht geeignet zu sein. Ich werde nochmal eine einfachere Frage in VBScripting stellen. Wenn ich mal was für Dich auf dem Wege zwischen der Idee und der Programmierung mit logischer Struktur tuen kann, laß es mich wissen, obwohl Du Dich ja in der Logik zumindest im Programm gut auskennst.
Und ansonsten hast Du natürlich recht, was den temporären Charakter der Dateinamen angeht.
Danke auch nochmal für den Hinweis mit dem Sendto Ordner, war mir garnicht bewußt, das das der öffnen mit Ordner ist. Gut gemacht Bastla.
Also nochmals Danke und alles Gute wünscht
Fränky
Bitte warten ..
Mitglied: bastla
24.08.2007 um 11:21 Uhr
Hallo Fraenky!

... der künstliche Startpunkt ...
... wäre Dein "C7765", oder? Da ließe sich vielleicht noch etwas machen :
01.
'DynRep.vbs
02.
Const LIMIT = 5
03.
Const PAR = "\par"
04.
Const LOGFILE = "DynRep.log"
05.
 
06.
sBasePar = "A"
07.
iBasePar = 1
08.
lBaseToken = 1
09.
 
10.
sDelim = "_"
11.
 
12.
Set fso = CreateObject("Scripting.FileSystemObject")
13.
Set objShell = CreateObject("WScript.Shell")
14.
 
15.
If WScript.Arguments.Count > 0 Then
16.
	sArg = WScript.Arguments(0)
17.
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
18.
		sPath = fso.GetFile(sArg).Path
19.
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)
20.
	Else 'oder ev eines Ordners
21.
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
22.
	End If
23.
End If
24.
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
25.
	Set oFolder = CreateObject("Shell.Application") _
26.
		.BrowseForFolder(0, "Ordner wählen", 16, 17)
27.
	If TypeName(oFolder) = "Nothing" Then
28.
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"
29.
		WScript.Quit(1)
30.
	Else
31.
		sPath = oFolder.Self.Path
32.
	End If
33.
End If
34.
 
35.
'Benutzereingaben
36.
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
37.
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
38.
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
39.
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
40.
 
41.
If bAll Then ' ## Einschränkung auf "Gesamtprojekt" ##
42.
	R = InputBox("Vorgabe eines Startwertes gewünscht (J/N)?", "Startwert vorgeben?", "N", xpos, ypos)
43.
	If UCase(Left(R, 1)) = "J" Then
44.
		Do
45.
			'Buchstabe
46.
			sBaseParLetter = sBasePar
47.
			sMin = "A"
48.
			sMax = "Z"
49.
			Do
50.
				R = UCase(InputBox("Bitte den Buchstaben (" & _
51.
					sMin & " - " & sMax & ") eingeben!", "Buchstabe", , xpos, ypos))
52.
				If R <> "" Then	sBaseParLetter = Left(R, 1)
53.
			Loop Until sBaseParLetter >= sMin And sBaseParLetter <=sMax
54.
			
55.
			'Absatznummer
56.
			iBaseParNumber = iBasePar
57.
			iMin = 0
58.
			iMax = 9999
59.
			Do
60.
				R = InputBox("Bitte den Startwert für die Absatznummer (" & _
61.
					CStr(iMin) & " - " & CStr(iMax) & ") eingeben!", "Absatznummer", iBasePar, xpos, ypos)
62.
				If R <> "" Then If IsNumeric(R) Then iBaseParNumber = CInt(R)
63.
			Loop Until iBaseParNumber >= iMin And iBaseParNumber <= iMax
64.
 
65.
			'Laufende Nummer
66.
			lBaseTokenNumber = lBaseToken
67.
			lMin = 0
68.
			lMax = 999999
69.
			Do
70.
				R = InputBox("Bitte den Startwert für die laufende Nummer (" & _
71.
					CStr(lMin) & " - " & CStr(lMax) & ") eingeben!", "Laufende Nummer", lBaseToken, xpos, ypos)
72.
				If R <> "" Then	If IsNumeric(R) Then lBaseTokenNumber = CLng(R)
73.
			Loop Until lBaseTokenNumber >= lMin And lBaseTokenNumber <= lMax
74.
			
75.
			'Kontrolle
76.
			sBase = sBaseParLetter & Right(CStr(10000 + iBaseParNumber), 4) & sDelim & Right(CStr(1000000 + lBaseTokenNumber), 6)
77.
			Do
78.
				R = InputBox("Bitte eingeben: " & vbCrLF & vbCrLF & _
79.
					"J, um " & sBase & " als Startwert zu verwenden, " & vbCrLF & _
80.
					"N, um mit dem Standardwert zu starten, oder " & vbCrLF & _
81.
					"W, um die Eingabe des Startwertes zu wiederholen.", _
82.
					"Startwert bestätigen", "J", xpos, ypos)
83.
				sWahl = UCase(Left(R, 1))
84.
			Loop Until sWahl = "J" Or sWahl = "N" Or sWahl = "W"
85.
			If sWahl = "N" Then
86.
				sBaseParLetter = sBasePar
87.
				iBaseParNumber = iBasePar
88.
				lBaseTokenNumber = lBaseToken
89.
			End If
90.
		Loop Until sWahl <> "W"
91.
		sBasePar = sBaseParLetter
92.
		iBasePar = iBaseParNumber
93.
		lBaseToken = lBaseTokenNumber
94.
	End If
95.
End If '## Einschränkung auf "Gesamtprojekt" ##
96.
 
97.
sPar = Chr(Asc(sBasePar) - 1)
98.
iPar = 10000 + iBasePar - 1
99.
lToken = 1000000 + lBaseToken
100.
 
101.
'Logdatei erstellen
102.
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)
103.
 
104.
'Dateien alphabetisch sortiert einlesen
105.
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
106.
If Not oExec.StdOut.AtEndOfStream Then
107.
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
108.
	'Alle Dateien durchgehen
109.
	For Each sFileName In aFiles
110.
		If Not bAll Then 'Zählung neu beginnen
111.
			sPar = sBasePar
112.
			iPar = 10000 + iBasePar
113.
			lToken = 1000000 + lBaseToken
114.
			iLeer = 0
115.
			bLUsed = False
116.
		Else
117.
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
118.
			bLUsed = True
119.
		End If
120.
		'Datei behandeln ...
121.
		If sFileName <> "" Then
122.
			ProcessFile sPath & "\" & sFileName
123.
			'... und protokollieren
124.
			oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
125.
				Right(CStr(lToken), 6) & " " & sFileName
126.
		End If
127.
	Next
128.
Else
129.
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
130.
		sPath & _
131.
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
132.
	WScript.Quit(1)
133.
End If
134.
oLog.Close
135.
'WScript.Echo "Ersetzen abgeschlossen."
136.
 
137.
Sub ProcessFile(sFile)
138.
Set oTheFile = fso.OpenTextFile(sFile, 1)
139.
sOut = ""
140.
Do While Not oTheFile.AtEndOfStream
141.
	sInL = oTheFile.ReadLine
142.
	If sInL <> PAR Then 'Kein leerer Absatz
143.
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
144.
			'... daher keine Aktion erforderlich.
145.
		Else 'LIMIT überschritten -> Buchstabenwechsel, ...
146.
			If bLUsed Then '... falls Buchstabe bereits verwendet wurde
147.
				If sPar < "Z" Then
148.
					sPar = Chr(Asc(sPar) + 1)
149.
				Else
150.
					sPar = "A"
151.
				End If
152.
				iPar = iPar + 1
153.
				bLUsed = False
154.
			End If
155.
		End If
156.
		iLeer = 0 'Zählung Leerzeilen rücksetzen
157.
 
158.
		'Zeile behandeln
159.
		aLine = Split(sInL, sToken, -1, vbTextCompare)
160.
		sLine = aLine(0)
161.
		For i = 1 To UBound(aLine)
162.
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
163.
				Right(CStr(lToken), 6) & sPost
164.
			sLine = sLine & sTag & aLine(i)
165.
			lToken = lToken + 1
166.
			bLUsed = True
167.
		Next
168.
	Else 'Leerzeile
169.
		iLeer = iLeer + 1
170.
		sLine = sInL
171.
	End If
172.
 
173.
	If sOut <> "" Then
174.
		sOut = sOut & vbCrLF & sLine
175.
	Else
176.
		sOut = sLine
177.
	End If
178.
Loop
179.
oTheFile.Close
180.
'Neuen Dateiinhalt schreiben
181.
fso.OpenTextFile(sFile, 2, True).Write sOut
182.
End Sub
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
"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
Bitte warten ..
Mitglied: Fraenky
24.08.2007 um 20:37 Uhr
Hallo Bastla.
Funktioniert einwandfrei der manuelle Startpunkt, habe ich mir nur anders vorgestellt. Abfrage:
Geben Sie Startnummer ein! Eingabe Syntax: A9999Trennzeichen999999 in einem Fenster.
Dann Programmcheck: Prüfe 1 = Buchstabe Prüfe 2-ende. Wenn etas anderes als Zahlen vorkommt, nimm dieses als festes Trennzeichen für diese Session, Wenn nicht, Break, Fehlermeldung: Kein Trennzeichen, Neueingabe. Wenn Ja, zähle Ziffern zwischen Trennzeichen und Buchstaben. Wenn >4 ab Pos. 4 abschneiden, Wenn <4 fülle mit führenden Nullen auf.
Prüfe ab Trennzeichen bis Ende. Wenn >6 Ziffern, abschneiden, wenn <6 Ziffern, mit führenden Nullen auffüllen.
Dann haben Wir nur ein Abfragefenster. Da stimme ich mit Dir voll überein, nur nötige Abfragen zu starten. Die ganze Startprozedur währe noch dahingehend zu vereinfachen, in dem das Programm alle über Fenster eingegebenen Parameter entweder intern in einer Startparametersektion abspeichert und nur eine Abfrage kommt:
Alle Startparameter übernehmen? J = run N = Öffne erste Abfrage usw oder Z.B N4 öffnet nur das 4. Abfragefenster, nimmt die Daten und startet durch. Zu diesem Zweck währen die Fenster noch sichtbar zu nummerieren, um die Zahlen besser behalten zu können.
Oder das Programm kreiert im Arbeitsordner eine Datei Parameter.txt und speichert die Startparameter dort ab.
Desweiteren könnte das Programm noch einen Baclupordner im Arbeitsordner erstellen und die unbearbeitete Datei unter Syntax: Originalname(Sonderzeichen)_Datum_Markierung abspeichern, um nachzuvollziehen, mit welcher Markierung die Datei schon bearbeitet wurde.
Mann könnte weiterhin als Startparameter die Prozessorauslastung reglementieren.
Ich bin aber der Meinung, das man mit 30% Energieeinsatz 70-80% Ergebniss erzielen kann.
Jede Annäherung an 100% führt zwar zur Perfektion, erfordert aber auch 100% Einsatz.
Das Script erfüllt alle meine Erwartungen 100%.
Die manuelle Starteingabe ist für Projekte gedacht, die zwar innhaltlich zusammengehören, aber zeitlich versetzt durchgeführt werden.
Ich habe auch schon ein weiteres Projekt in der Pipeline, dafür will ich aber erst mal meine Liste aufräumen und ordnen. Alles weitere dort unter VB Scripte.
Also, ich meine, wenn Du die vereinfachte Startprozedur noch reslisieren würdest, das währe natürlich das Sahnehäubchen auf dem (Super-duper-überdrüber-einfachnurtoll-) Programm.
Und wenn Du dann noch die Problematik bezüglich der Sonderzeichen ins Script integrieren könntest, das währe dann Superdupaübertoll.
Also schönen Abend noch
Fränky
Bitte warten ..
Mitglied: bastla
25.08.2007 um 01:38 Uhr
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.

...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:
01.
'DynRep-Last.vbs
02.
Const LIMIT = 5
03.
Const PAR = "\par"
04.
Const LOGFILE = "DynRep.log"
05.
Const PARAMFILE = "Parameter.txt"
06.
 
07.
'Defaultwerte
08.
sBasePar = "A"
09.
iBasePar = 1
10.
lBaseToken = 1
11.
sBaseDelim = "_"
12.
sDelimAccept = "_-#|@" 'zulässige Trennzeichen, bei Bedarf ergänzen
13.
 
14.
Set fso = CreateObject("Scripting.FileSystemObject")
15.
Set objShell = CreateObject("WScript.Shell")
16.
 
17.
If WScript.Arguments.Count > 0 Then
18.
	sArg = WScript.Arguments(0)
19.
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei
20.
		sPath = fso.GetFile(sArg).Path
21.
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)
22.
	Else 'oder ev eines Ordners
23.
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
24.
	End If
25.
End If
26.
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
27.
	Set oFolder = CreateObject("Shell.Application") _
28.
		.BrowseForFolder(0, "Ordner wählen", 16, 17)
29.
	If TypeName(oFolder) = "Nothing" Then
30.
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"
31.
		WScript.Quit(1)
32.
	Else
33.
		sPath = oFolder.Self.Path
34.
	End If
35.
End If
36.
 
37.
'Benutzereingaben
38.
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")
39.
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True
40.
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")
41.
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")
42.
 
43.
If bAll Then ' ## Einschränkung auf "Gesamtprojekt" ##
44.
	Do
45.
		'Buchstabe
46.
		sBaseParLetter = sBasePar
47.
		sMin = "A"
48.
		sMax = "Z"
49.
		'Absatznummer
50.
		iBaseParNumber = iBasePar
51.
		iMin = 0
52.
		iMax = 9999
53.
		'Laufende Nummer
54.
		lBaseTokenNumber = lBaseToken
55.
		lMin = 0
56.
		lMax = 999999
57.
		'Delimiter
58.
		sBaseDelimChar = sBaseDelim
59.
	
60.
		sBase = sBaseParLetter & Right(CStr(10000 + iBaseParNumber), 4) & sBaseDelimChar & Right(CStr(1000000 + lBaseTokenNumber), 6)
61.
		R = InputBox("Startwert entsprechend dem Muster eingeben," & vbCrLF & _
62.
			"wobei führende Nullen bei den Nummern weggelassen werden können und" & vbCrLF & _
63.
			"das Trennzeichen aus der folgenden Liste stammen muss:" & vbCrLF & _
64.
			sDelimAccept, "Startwert", sBase, xpos, ypos)
65.
 
66.
		bOK = True
67.
		If R = "" Then
68.
			' bei leerer Eingabe oder Abbruch Defaultwerte verwenden, daher keine Änderung erforderlich
69.
		Else
70.
			If Len(R) >= 2 Then 'mindestens Buchstabe und Trennzeichen könnten eingegeben worden sein
71.
				'Buchstaben prüfen
72.
				If UCase(Left(R, 1)) >= sMin And UCase(Left(R, 1)) <= sMax Then
73.
					sBaseParLetter = UCase(Left(R, 1))
74.
				Else
75.
					bOK = False
76.
				End If
77.
 
78.
				'Ziffer oder Trennzeichen
79.
				iDelimPos = 0
80.
				For i = 2 To Len(R)
81.
					If Not IsNumeric(Mid(R, i, 1)) Then
82.
						If InStr(sDelimAccept, Mid(R, i, 1)) Then
83.
							sBaseDelimChar = Mid(R, i, 1)
84.
							iDelimPos = i
85.
						Else
86.
							bOK = False
87.
							'### Beispiel für Fehlermeldung ###
88.
							'MsgBox "Das verwendete Trennzeichen " & Mid(R, i, 1) & " ist nicht zulässig!"
89.
							'### Beispiel für Fehlermeldung ###
90.
						End If
91.
						Exit For
92.
					End If
93.
				Next
94.
				
95.
				Select Case iDelimPos 'abhängig von Position des Trennzeichens
96.
				Case 0, 1 'kein gültiges Trennzeichen enthalten; (1 eigentlich unmöglich)
97.
					bOK = False
98.
				Case 2 'keine Absatznummer
99.
					If iDelimPos < Len(R) Then 'laufende Nummer
100.
						If IsNumeric(Mid(R, iDelimPos + 1)) Then
101.
							lBaseTokenNumber = CLng(Mid(R, iDelimPos + 1, 6))
102.
						Else
103.
							bOK = False
104.
						End If
105.
					End If
106.
				Case Len(R) 'Trennzeichen am Ende, daher keine laufende Nummer
107.
										If IsNumeric(Mid(R, 2, iDelimPos - 2)) Then
108.
						If iDelimPos <= 6 Then
109.
							iBaseParNumber = CStr(Mid(R, 2, iDelimPos - 2))
110.
						Else
111.
							iBaseParNumber = CStr(Mid(R, 2, 4))
112.
						End If
113.
					Else
114.
						bOK = False
115.
					End If 
116.
				Case Else 'Absatznummer und laufende Nummer
117.
					If IsNumeric(Mid(R, 2, iDelimPos - 2)) Then
118.
						If IsNumeric(Mid(R, iDelimPos + 1)) Then
119.
							If iDelimPos <= 6 Then
120.
								iBaseParNumber = CInt(Mid(R, 2, iDelimPos - 2))
121.
							Else
122.
								iBaseParNumber = CInt(Mid(R, 2, 4))
123.
							End If
124.
							lBaseTokenNumber = CLng(Mid(R, iDelimPos + 1, 6))
125.
						Else
126.
							bOK = False
127.
						End If 
128.
					Else
129.
						bOK = False
130.
					End If
131.
				End Select
132.
			Else
133.
				bOK = False
134.
			End If
135.
		End If
136.
	Loop Until bOK
137.
	sBasePar = sBaseParLetter
138.
	iBasePar = iBaseParNumber
139.
	lBaseToken = lBaseTokenNumber
140.
	sBaseDelim = sBaseDelimChar
141.
End If '## Einschränkung auf "Gesamtprojekt" ##
142.
 
143.
sPar = Chr(Asc(sBasePar) - 1)
144.
iPar = 10000 + iBasePar - 1
145.
lToken = 1000000 + lBaseToken
146.
sDelim = sBaseDelim
147.
 
148.
'Logdatei erstellen
149.
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)
150.
 
151.
'Dateien alphabetisch sortiert einlesen
152.
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")
153.
If Not oExec.StdOut.AtEndOfStream Then
154.
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
155.
	'Alle Dateien durchgehen
156.
	For Each sFileName In aFiles
157.
		If Not bAll Then 'Zählung neu beginnen
158.
			sPar = sBasePar
159.
			iPar = 10000 + iBasePar
160.
			lToken = 1000000 + lBaseToken
161.
			iLeer = 0
162.
			bLUsed = False
163.
		Else
164.
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen
165.
			bLUsed = True
166.
		End If
167.
		'Datei behandeln ...
168.
		If sFileName <> "" Then
169.
			ProcessFile sPath & "\" & sFileName
170.
			'... und protokollieren
171.
			oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
172.
				Right(CStr(lToken), 6) & " " & sFileName
173.
		End If
174.
	Next
175.
Else
176.
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _
177.
		sPath & _
178.
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"
179.
	WScript.Quit(1)
180.
End If
181.
oLog.Close
182.
 
183.
'Parameter speichern (für Verabeitung in Batch wichtig: sToken in letzte Zeile schreiben)
184.
fso.OpenTextFile(sPath & "\" & PARAMFILE, 2, True).Write _
185.
	sPre & vbCrLF & sPost & vbCrLF & bAll & vbCrLf & sToken
186.
 
187.
Sub ProcessFile(sFile)
188.
Set oTheFile = fso.OpenTextFile(sFile, 1)
189.
sOut = ""
190.
Do While Not oTheFile.AtEndOfStream
191.
	sInL = oTheFile.ReadLine
192.
	If sInL <> PAR Then 'Kein leerer Absatz
193.
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...
194.
			'... daher keine Aktion erforderlich.
195.
		Else 'LIMIT überschritten -> Buchstabenwechsel, ...
196.
			If bLUsed Then '... falls Buchstabe bereits verwendet wurde
197.
				If sPar < "Z" Then
198.
					sPar = Chr(Asc(sPar) + 1)
199.
				Else
200.
					sPar = "A"
201.
				End If
202.
				iPar = iPar + 1
203.
				bLUsed = False
204.
			End If
205.
		End If
206.
		iLeer = 0 'Zählung Leerzeilen rücksetzen
207.
 
208.
		'Zeile behandeln
209.
		aLine = Split(sInL, sToken, -1, vbTextCompare)
210.
		sLine = aLine(0)
211.
		For i = 1 To UBound(aLine)
212.
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
213.
				Right(CStr(lToken), 6) & sPost
214.
			sLine = sLine & sTag & aLine(i)
215.
			lToken = lToken + 1
216.
			bLUsed = True
217.
		Next
218.
	Else 'Leerzeile
219.
		iLeer = iLeer + 1
220.
		sLine = sInL
221.
	End If
222.
 
223.
	If sOut <> "" Then
224.
		sOut = sOut & vbCrLF & sLine
225.
	Else
226.
		sOut = sLine
227.
	End If
228.
Loop
229.
oTheFile.Close
230.
'Neuen Dateiinhalt schreiben
231.
fso.OpenTextFile(sFile, 2, True).Write sOut
232.
End Sub
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:
01.
@echo on & setlocal
02.
if not exist %1 goto :eof
03.
cd /d "%~f1" 2>nul || cd /d "%~dp1"
04.
 
05.
set "Bak=Sicherung"
06.
set "Param=Parameter.txt"
07.
set "List=DR.lst"
08.
 
09.
set /a Nr=1001
10.
set Datum=%date:~-4%-%date:~-7,2%-%date:~-10,2%
11.
if not exist "%Bak%" md "%Bak%"
12.
if exist "%List%" del "%List%"
13.
for /f "delims=" %%i in ('dir /b /on /a-d *.rtf') do call :ProcessFile "%%i"
14.
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do copy "%%j" "%Bak%\%%j" & ren "%%j" %%i.rtf & 
15.
C:\Skripts\DynRep-Last.vbs "%cd%"
16.
if exist "%Param%" for /f "usebackq delims=" %%i in ("%Param%") do set "Token=%%i"
17.
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist "%Bak%\%%j" move "%Bak%\%%j" "%Bak%\%%~nj_%Datum%_%Token%%%~xj"
18.
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist %%i.rtf move %%i.rtf "%%i_%%j"
19.
pause
20.
goto :eof
21.
:ProcessFile
22.
(echo %Nr:~-3%=%~1)>>"%List%"
23.
set /a Nr+=1
24.
goto :eof
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?
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 10:17 Uhr
Hallo Bastla.
Du bist nicht nur gut, sondern auch noch schnell.

Abgesehen davon finde ich detaillierte
Beschreibungen der gewünschten
Funktionalität super, besonders wenn sie
im Vorhinein erfolgen.

Ok. Du hast ja recht.



> ...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.

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. Immerhin handelt es sich um das erlernen einer Fremdsprache und in diesem Bereich liegen nicht gerade meine Stärken. Was Du, weil schon tausende male gemacht, aus dem FF ohne groß nachzudenken in Maschienensprache übersetzt, stellt für mich erstmal ein no go dar. Also eine große Hürde.

> Mann könnte weiterhin als
Startparameter die Prozessorauslastung
reglementieren.
Dem Manne wünsche ich viel Spaß
dabei ...

Ok.


Ergänzend zu Deinen Vorgaben habe ich
eine Liste der erlaubten Trennzeichen
vorgesehen (siehe Definitionen am Anfang des
Scripts).

Kann ich diese Liste erweitern?

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 ...

Ja, das ist ja auch ein Superdupaübertolles Programm. Und diese stehen immer über 100%

P.S.: Eine Bitte: Könntest Du Dich
wohl beim Wort "währe" auf die
erforderlichen 4 Buchstaben
beschränken?


Ok. Da sind Wir einer Meinung.

Jetzt noch mal zum Programm.
Ich habe da ein sehr schwerwiegendes Problem festgestellt.
Und zwar funktionieren die Sonderzeichen nicht nur nicht beim öffnen der Dateien, sondern auch nicht, wenn Sonderzeichen als Markierung eingegeben werden.
Bei der Markierung coração funktionierte es nicht, bei cora dagegen wohl.
Die Arbeit mit Sonderzeichen ist für mich sehr wichtig, weil ich mich mit vielen portugiesichen Arbeiten beschäftige. Dafür sollten Wir unbedingt eine Lösung finden.
Nützt es Dir, wenn ich Dir eine Liste mit Sonderzeichen erstelle, oder besser, wenn Du ein Script zur Ermittlung der eingesetzten Sonderzeichen schrebst?
In meinem html editor ist Coração im Quelltext mit Cora&ccedil;&atilde;o darbestellt, die gleichnamige Datei dagegen lautet Cora%E7%E3o.php.

Gruß
Fränky
Bitte warten ..
Mitglied: bastla
25.08.2007 um 11:58 Uhr
Hallo Fraenky!

...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.
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":
01.
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.
Verlangen - nein, Motivation - ?
Aber na gut, die entsprechenden Zeilen würden etwa lauten:
01.
Set oParam = fso.OpenTextFile(sPath & "\" & PARAMFILE, 1)
02.
sPre = oParam.ReadLine
03.
sPost = oParam.ReadLine
04.
bAll = oParam.ReadLine
05.
sToken = oParam.ReadLine
06.
oParam.Close
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 ...

Ergänzend zu Deinen Vorgaben habe ich eine Liste der erlaubten Trennzeichen vorgesehen siehe Definitionen am Anfang des Scripts).
Kann ich diese Liste erweitern?
Zusätzliche Trennzeichen einfach innerhalb der Anführungszeichen in der Zeile
01.
sDelimAccept = "_-#|@" 'zulässige Trennzeichen, bei Bedarf ergänzen
hinzufügen ...

In meinem html editor ist Coração im Quelltext mit Cora&ccedil;&atilde;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
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 18:11 Uhr
Hallo 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....

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.

> In meinem html editor ist
Coração im Quelltext mit
Cora&ccedil;&atilde;o darbestellt,
die gleichnamige Datei dagegen lautet
Cora%E7%E3o.php.
Eigentlich waren wir bei rtf-Dateien ...

Ja, aber die Problematik ist ja die selbe und in diesem Beispiel liegt auch die Lösung. Zur Erinnerung: Das Script kann weder Dateien mit Sonderzeichen öffnen:
Jetzt währe herrauszufinden, wie das Script die Dateien mit Sonderzeichen sieht: Im Explorer erscheinen sie als Coração. Diese hat es ja nicht gefunden. Dann bleibt noch Cora&ccedil;&atilde;o, dies halte ich für die Schreibweise in html. Favorisieren tue ich Cora%E7%E3o. Das würde bedeuten, das ç=%E7 und ã=%E3 ist. Also müssen die verwendeten Sonderzeichen herrausgefunden werden,
Script Abfrage: Geben Sie Startordner an, dann öffnet Script alle Dateien, die es öffnen kann und schreibt alle Buchstaben, die nicht im deutschen Schriftsatz vorhanden sind, in eine Datei, dann haben Wir schon mal alle eingesetzten Sonderzeichen.
und den entsprechenden Buchstabenkombinationen von Hand zugeordnet werden. Diese Zuordnungen kommen dann beim Datei öffnen zum Zuge.
Noch kann das Script im Text Sonderzeichen als Markierung erkennen. Das ist beim durchzählen einzelner Wörter interessant, um die Gewichtung festzustellen.
Das ersetzen erledigt ja auch jeder Editor, nur das Zählen nicht. Was ein Editor kann, kann doch wohl unser sich an die 200% annäherndes Programm auch erledigen können. Also müssen Wir herrausfinden, warum das Script im .txt keine Sonderzeichen erkennen kann. Sind Felder nicht entsprechend deklariert oder für diesen Typ Daten ungünstige Befehle verwendet worden? 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.

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.

Alles klar, werde versuchen, alle Ausnahmefälle als Beispieldaten zur Verfügung zu stellen.

Speziell hinsichtlich der
Sonderzeichenproblematik ist die Situation
für mich einerseits Neuland,

Ja dann kannst Du ja meine Situation bezüglich Programmcode besser nachvollziehen.

Alles Gute
Fränky
Bitte warten ..
Mitglied: bastla
25.08.2007 um 18:31 Uhr
Hallo Fraenky!

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
Bitte warten ..
Mitglied: Fraenky
25.08.2007 um 20:57 Uhr
Hallo Basta.

weniger - dann schreibe ich diesen Ordner in
die "DynRep.bat", anstatt dort den
Pfad zu ermitteln und das war's.

Kann ich den Pfag auch ins Script selbst einfügen, wenn ich keine Sonderzeichen im Dateinamen verwendet werden und wenn ja wie und wo?

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.

Ich muß zugeben, das ich mich mit den batch Dateien noch nicht weiter beschäftigt habe. Werde ich mir morgen noch mal ansehen.

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...

Währe da nicht ein Befehl sinnvoll, etwa wie transform data field von ANSI nach ASCI, um entsprechende Bearbeitungen durchführen zu können ?

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.

Ja klar, funktioniert, sorry, weiß auch nicht, was da beim ersten Mal schief gelaufen ist.

Vielleicht fragst Du das jemanden, der sich
damit auskennt ...

Na, wenn Du´s nicht weißt, werde ich wohl lange suchen können.

... was einer Vorgangsweise entspricht, die
Du hinsichtlich der Dateinamen offensichtlich
nicht goutierst ...

Was irgenwie meinem Wiederwillen entspringt, wo ich doch ein Script einsetze, noch etwas zweites einzusetzen, aber das hängt ja wohl mit der verschiedenen
Codierung zusammen und ist von daher wohl als Einschränkung des VBS anzusehen.

Bis auf die Batchdateien, in die ich mich noch einarbeiten werde, haben Wir dieses Projekt wohl entgültig zu Ende gebracht.
War schön, etwas von Deiner 30 jährigen Berufserfahrung profitieren zu dürfen.
Ist schon toll, zu sehen, wie die Vorstellungen schnell und richtig umgesetzt werden.
Danke dafür
Fränky
Bitte warten ..
Mitglied: bastla
25.08.2007 um 21:45 Uhr
Hallo Fraenky!

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:
01.
cd /d "D:\Dein\Arbeitsordner"
02.
if exist %1 cd /d "%~f1" 2>nul || cd /d "%~dp1"
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
01.
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog
02.
	Set oFolder = CreateObject("Shell.Application") _
03.
		.BrowseForFolder(0, "Ordner wählen", 16, 17)
04.
	If TypeName(oFolder) = "Nothing" Then
05.
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"
06.
		WScript.Quit(1)
07.
	Else
08.
		sPath = oFolder.Self.Path
09.
	End If
10.
End If
auf die eine Zeile
01.
If sPath = "" Then sPath = "D:\Dein\Arbeitsordner" ''Kein (gültiger) Pfad übergeben, daher Standard-Arbeitsordner verwenden
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 ...

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
Bitte warten ..
Mitglied: Fraenky
26.08.2007 um 10:35 Uhr
Hallo Bastla.
Komme wohl erst in der nächsten Woche dazu, mich mit den .bat zu beschäftigen.
Ich konzeitriere mich jetzt erstmal darauf, die liste-sortieren.vbs zu verstehen.
Fängt gerade an, etwas durch mein Nadelör zu tröpfeln.
Gruß
Fränky
Bitte warten ..
Mitglied: Fraenky
30.08.2007 um 10:21 Uhr
Hallo bastla
Ich werde mich mehr mit dem Thema VBS beschäftigen und möchte hier nur noch einige abschließende Fragen stellen und Anmerkungen machen.
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?
Wie binde ich ein .vbs in den html code ein oder rufe es vom Server auf?
Wie rufe ich aus einem .vbs eine ,bat auf?

Zu den zwei Ablaufplänen möchte ich noch sagen, das ich Dir einerseits zeigen wollte, das ich versuche, die Programmierlogik zu erfassen, andererseits wollte ich Dir Gelegenheit geben, Deine Zusage aus dem Bandwurm schnell und effizient umzusetzen, wobei natürlich der Ablaufplan nicht stur eins zu eins umzusätzen währe, sondern intelligent zu interpretieren, weil ich wohl noch nicht alles richtig erfasst habe und bis auf die Programmierebene gebracht habe.
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.

Also, ich werde mich jetzt erstmal nicht weiter mit .bat beschäftigen, werde aber gegebenenfalls hier wieder nachfragen.

Dann können Wir ja hier diese Folge abschließen.

Viele Grüße
Fränky
Bitte warten ..
Mitglied: bastla
30.08.2007 um 10:51 Uhr
Hallo Fraenky!

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:
01.
WScript.CreateObject("WScript.Shell").Run "C:\Skripts\Test.bat"
Ansonsten findest Du zu "Run" eine Menge Information und Beispiele im Web ...

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
Bitte warten ..
Mitglied: Fraenky
30.08.2007 um 21:13 Uhr
Hallo bastla
Hätte ich nicht als Ehrgeiz bezeichnet, sondern eher als Ausschöpfen der möglichen Bandbreite beim Posten, um dann eine gesunde Mitte zu finden.
Aber gut.
Dann können Wir diesen Beitrag ja als beendet betrachten.
Danke und alles Gute
Fränky
Bitte warten ..
Ähnliche Inhalte
VB for Applications

VB-Script - WshShell.Run - Programm inklusive Datei öffnen

Frage von FelsenVB for Applications8 Kommentare

Hallo, ich möchte mit einem VB-Script eine Datei öffnen (innerhalb des CAD-Programms CATIA-V5). Das ist mein Befehl: WshShell.Run " ...

VB for Applications

VB-Script in VB-Script starten und Parameter übergeben

gelöst Frage von denkisVB for Applications7 Kommentare

Hallo liebe Scriptgemeinde, ich muss mehrere Rechner für den Übergang in eine neue Domäne vorbereiten. Dafür sind drei wesentliche ...

Batch & Shell

INI Datei über Batch Script verändern

Frage von SchmidleBatch & Shell3 Kommentare

Hallo zusammen, ich muss in einer ini Datei einen Eintrag anpassen, der den ProxyServer hinterlegt. Wir haben einen neuen ...

VB for Applications

Mit VB Script Sonderzeichen in Datei und Ordnernamen umbenennen

Frage von SirMcFrostyVB for Applications2 Kommentare

Folgendes Szenario: Einige Datei und/oder Ordnernamen besitzen Sonderzeichen(-kombinationen) die nun geändert/umbenannt werden müssen Beispiel: Aus ""Geschäftsüberlassung" soll wieder "Geschäftsüberlassung" ...

Neue Wissensbeiträge
iOS
IOS hat nen Cursor !!!
Tipp von Criemo vor 7 StundeniOS

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Off Topic
Avengers 4: Endgame - Erster Trailer
Information von Frank vor 2 TagenOff Topic1 Kommentar

Ich weiß es ist Off Topic, aber ich freue mich auf diesen Film und vielleicht geht es anderen hier ...

Webbrowser
Microsoft bestätigt Edge mit Chromium-Kern
Information von Frank vor 2 TagenWebbrowser5 Kommentare

Microsoft hat nun in seinem Blog bestätigt, dass die nächste Edge Version kein EdgeHTML mehr für die Darstellung benutzen ...

Sicherheit

MikroTik: Sicherheitslücke wird ausgenutzt obwohl ein Update seit langem verfügbar ist

Information von sabines vor 2 TagenSicherheit

Obwohl ein Update, dass die nun massenhaft ausgenutzte Lücke schließt, seit langem (März 2018) verfügbar ist, wird es offensichtlich ...

Heiß diskutierte Inhalte
Exchange Server
Exchange Server 2010: Keine Eingehenden E-MAils
Frage von gabeBUExchange Server15 Kommentare

Hallo Zusammen Ich habe das kurzen auf dem Exchange 2010 Server das Problem, dass ich keine externen E-Mails mehr ...

Rechtliche Fragen
Systemhaus auf Abwegen
Frage von rocco61Rechtliche Fragen13 Kommentare

Hallo zusammen, bin derzeit ratlos bei dem folgenden Scenario: In einen Seniorenheim wurde beschlossen, die IT an eine andere ...

Router & Routing
MikroTik - Routing, Bridging, Switching
gelöst Frage von Alex29Router & Routing9 Kommentare

Hallo in die Runde, als Hobby-Admin würde ich bitte mal wieder Eure Hilfe benötigen. Seit der Umstellung auf RouterOS ...

Outlook & Mail
Kalendersync mit Android und Outlook
Frage von Stefan007Outlook & Mail8 Kommentare

Hi Leute, kennt jemand eine Möglichkeit um Termine zwischen installiertem Outlook auf dem PC und dem Kalender auf einem ...