Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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)

Frage Entwicklung Batch & Shell

Mitglied: Fraenky

Fraenky (Level 1) - Jetzt verbinden

21.08.2007, aktualisiert 30.08.2007, 9195 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

Heiß diskutierte Inhalte
Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...

Peripheriegeräte
Wlan stört Funkmaus (11)

Frage von Falaffel zum Thema Peripheriegeräte ...

Peripheriegeräte
gelöst USB Festplatte verliert Laufwerksbuchstabe (9)

Frage von cese4321 zum Thema Peripheriegeräte ...