fraenky
Goto Top

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

Mit Batch Datei Markierung( z.B. zzzh1) in rtf doks finden und diese mit laufenden Nummern im Format: A2234 ersetzen

Zur statistischen Auswertung möchte ich in rtf dokumenten nach unterschiedlichen Zeichenfolgen suchen lassen und diese mit fortlaufenden Zahlen im Format A001 ersetzen.
Wenn ein Absatz größer als 5 Zeilen leer kommt, sollte der erste Buchstabe wechseln, die Zahlen aber weiter addiert werden.
Interesannt währe auch eine Abfrage beim Starten der Batch nach der StartZahl Z.B. C7765, ab der weiter addiert wird.
Kann mir da jemand weiterhelfen?
Gruß Fraenky

Content-ID: 66661

Url: https://administrator.de/contentid/66661

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

bastla
bastla 21.08.2007 um 11:43:13 Uhr
Goto Top
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
Fraenky
Fraenky 21.08.2007 um 12:46:43 Uhr
Goto Top
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
bastla
bastla 21.08.2007 um 16:46:48 Uhr
Goto Top
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:
A0001Z000001
A0001Z000002
A0001Z000003
A0001Z000004
B0002Z000005
B0002Z000006
C0003Z000007
C0003Z000008
C0003Z000009
C0003Z000010
C0003Z000011
...
F0032Z000294
F0032Z000295
G0033Z000296
...
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
\par
beinhaltet)?

Grüße
bastla
Fraenky
Fraenky 21.08.2007 um 19:16:40 Uhr
Goto Top
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
bastla
bastla 21.08.2007 um 21:21:08 Uhr
Goto Top
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" face-wink 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
Fraenky
Fraenky 21.08.2007 um 21:38:59 Uhr
Goto Top
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
Fraenky
Fraenky 22.08.2007 um 11:36:08 Uhr
Goto Top
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
bastla
bastla 22.08.2007 um 21:13:22 Uhr
Goto Top
Hallo Fraenky!

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

Jetzt hätte ich aber etwas zum Testen für Dich:
'DynRep.vbs  
Const LIMIT = 5
Const PAR = "\par"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("WScript.Shell")  

If WScript.Arguments.Count > 0 Then
	sArg = WScript.Arguments(0)
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei  
		sPath = fso.GetFile(sArg).Path
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)  
	Else 'oder ev eines Ordners  
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
	End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog  
	Set oFolder = CreateObject("Shell.Application") _  
		.BrowseForFolder(0, "Ordner wählen", 16, 17)  
	If TypeName(oFolder) = "Nothing" Then  
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"  
		WScript.Quit(1)
	Else
		sPath = oFolder.Self.Path
	End If
End If

'Benutzereingaben  
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")  
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True  
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")  
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")  

sPar = "@"  
iPar = 10000
sDelim = "_"  
lToken = 1000000
iLeer = 0

'Dateien alphabetisch sortiert einlesen  
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d " & sPath & "\*.rtf")  
If Not oExec.StdOut.AtEndOfStream Then
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
	'Alle Dateien durchgehen  
	For Each sFileName In aFiles
		If Not bAll Then 'Zählung neu beginnen  
			sPar = "A"  
			iPar = 10001
			lToken = 1000000
			iLeer = 0
		Else
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen  
		End If
		'Datei behandeln  
		If sFileName <> "" Then ProcessFile sPath & "\" & sFileName  
	Next
Else
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _  
		sPath & _
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"  
	WScript.Quit(1)
End If
WScript.Echo "Ersetzen abgeschlossen."  

Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""  
Do While Not oTheFile.AtEndOfStream
	sInL = oTheFile.ReadLine
	If sInL <> PAR Then 'Kein leerer Absatz  
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...  
			'... daher keine Aktion erforderlich.  
		Else 'LIMIT überschritten -> Buchstabenwechsel  
			If sPar < "Z" Then  
				sPar = Chr(Asc(sPar) + 1)
			Else
				sPar = "A"  
			End If
			iPar = iPar + 1
		End If
		iLeer = 0 'Zählung Leerzeilen rücksetzen  

		'Zeile behandeln  
		aLine = Split(sInL, sToken, -1, vbTextCompare)
		sLine = aLine(0)
		For i = 1 To UBound(aLine)
			lToken = lToken + 1
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
				Right(CStr(lToken), 6) & sPost
			sLine = sLine & sTag & aLine(i)
		Next
	Else 'Leerzeile  
		iLeer = iLeer + 1
		sLine = sInL
	End If

	If sOut <> "" Then  
		sOut = sOut & vbCrLF & sLine
	Else
		sOut = sLine
	End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben  
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
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:
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 face-wink).

Bitte beachten: Es werden (zumindest in dieser Version) keine Sicherungskopien erstellt!

Grüße
bastla
Fraenky
Fraenky 22.08.2007 um 22:32:46 Uhr
Goto Top
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
bastla
bastla 22.08.2007 um 22:47:07 Uhr
Goto Top
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 ... face-smile
Fraenky
Fraenky 22.08.2007 um 23:00:13 Uhr
Goto Top
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
bastla
bastla 22.08.2007 um 23:08:36 Uhr
Goto Top
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
wscript //nologo "Scriptpfad\DynRep.vbs" 
versuchen.

Grüße
bastla
bastla
bastla 22.08.2007 um 23:19:20 Uhr
Goto Top
... ü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
Fraenky
Fraenky 22.08.2007 um 23:26:43 Uhr
Goto Top
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
bastla
bastla 23.08.2007 um 00:01:07 Uhr
Goto Top
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):
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
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
Fraenky
Fraenky 23.08.2007 um 00:39:15 Uhr
Goto Top
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
bastla
bastla 23.08.2007 um 11:14:54 Uhr
Goto Top
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:
C0003_000009 001.rtf
G0007_000028 002.rtf
...
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):
@echo off & setlocal
if not exist %1 goto :eof
cd /d "%~f1" 2>nul || cd /d "%~dp1"  
echo Bearbeite Dateien in %cd% ...
set "List=DR.lst"  
set /a Nr=1001
if exist "%List%" del "%List%"  
for /f "delims=" %%i in ('dir /b /on /a-d *.rtf') do call :ProcessFile "%%i"  
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do ren "%%j" %%i.rtf  
echo Script wird gestartet ...
C:\Skripts\DynRep.vbs "%cd%"  
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist %%i.rtf ren %%i.rtf "%%i_%%j"  
goto :eof
:ProcessFile
(echo %Nr:~-3%=%~1)>>"%List%"  
set /a Nr+=1
goto :eof
Der Scriptcode sieht (vorbehaltlich Deiner Änderungen bei den "InputBox"-Anweisungen) jetzt so aus:
'DynRep.vbs  
Const LIMIT = 5
Const PAR = "\par"  
Const LOGFILE = "DynRep.log"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("WScript.Shell")  

If WScript.Arguments.Count > 0 Then
	sArg = WScript.Arguments(0)
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei  
		sPath = fso.GetFile(sArg).Path
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)  
	Else 'oder ev eines Ordners  
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
	End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog  
	Set oFolder = CreateObject("Shell.Application") _  
		.BrowseForFolder(0, "Ordner wählen", 16, 17)  
	If TypeName(oFolder) = "Nothing" Then  
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"  
		WScript.Quit(1)
	Else
		sPath = oFolder.Self.Path
	End If
End If

'Benutzereingaben  
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")  
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True  
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")  
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")  

sPar = "@"  
iPar = 10000
sDelim = "_"  
lToken = 1000000
iLeer = 0

'Logdatei erstellen  
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)  

'Dateien alphabetisch sortiert einlesen  
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")  
If Not oExec.StdOut.AtEndOfStream Then
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
	'Alle Dateien durchgehen  
	For Each sFileName In aFiles
		If Not bAll Then 'Zählung neu beginnen  
			sPar = "A"  
			iPar = 10001
			lToken = 1000000
			iLeer = 0
			bLUsed = False
		Else
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen  
			bLUsed = True
		End If
		'Datei behandeln ...  
		If sFileName <> "" Then  
			ProcessFile sPath & "\" & sFileName  
			'... und protokollieren  
			oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
				Right(CStr(lToken), 6) & " " & sFileName  
		End If
	Next
Else
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _  
		sPath & _
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"  
	WScript.Quit(1)
End If
oLog.Close
'WScript.Echo "Ersetzen abgeschlossen."  

Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""  
Do While Not oTheFile.AtEndOfStream
	sInL = oTheFile.ReadLine
	If sInL <> PAR Then 'Kein leerer Absatz  
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...  
			'... daher keine Aktion erforderlich.  
		Else 'LIMIT überschritten -> Buchstabenwechsel, ...  
			If bLUsed Then '... falls Buchstabe bereits verwendet wurde  
				If sPar < "Z" Then  
					sPar = Chr(Asc(sPar) + 1)
				Else
					sPar = "A"  
				End If
				iPar = iPar + 1
				bLUsed = False
			End If
		End If
		iLeer = 0 'Zählung Leerzeilen rücksetzen  

		'Zeile behandeln  
		aLine = Split(sInL, sToken, -1, vbTextCompare)
		sLine = aLine(0)
		For i = 1 To UBound(aLine)
			lToken = lToken + 1
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
				Right(CStr(lToken), 6) & sPost
			sLine = sLine & sTag & aLine(i)
			bLUsed = True
		Next
	Else 'Leerzeile  
		iLeer = iLeer + 1
		sLine = sInL
	End If

	If sOut <> "" Then  
		sOut = sOut & vbCrLF & sLine
	Else
		sOut = sLine
	End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben  
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
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:
R = InputBox("Alle Dateien als Gesamtprojekt betrachten (J/N)?", "Gesamtprojekt", "J", xpos, ypos)  
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:
@echo off & setlocal
if not exist %1 goto :eof
cd /d "%~f1" 2>nul || cd /d "%~dp1"  
set "List=DR.lst"  
if not exist "%List%" goto :eof  
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist "%%i_%%j" ren "%%i_%%j" "%%j"  
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
Fraenky
Fraenky 23.08.2007 um 17:05:08 Uhr
Goto Top
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
bastla
bastla 24.08.2007 um 11:21:06 Uhr
Goto Top
Hallo Fraenky!

... der künstliche Startpunkt ...
... wäre Dein "C7765", oder? Da ließe sich vielleicht noch etwas machen face-wink:
'DynRep.vbs  
Const LIMIT = 5
Const PAR = "\par"  
Const LOGFILE = "DynRep.log"  

sBasePar = "A"  
iBasePar = 1
lBaseToken = 1

sDelim = "_"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("WScript.Shell")  

If WScript.Arguments.Count > 0 Then
	sArg = WScript.Arguments(0)
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei  
		sPath = fso.GetFile(sArg).Path
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)  
	Else 'oder ev eines Ordners  
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
	End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog  
	Set oFolder = CreateObject("Shell.Application") _  
		.BrowseForFolder(0, "Ordner wählen", 16, 17)  
	If TypeName(oFolder) = "Nothing" Then  
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"  
		WScript.Quit(1)
	Else
		sPath = oFolder.Self.Path
	End If
End If

'Benutzereingaben  
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")  
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True  
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")  
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")  

If bAll Then ' ## Einschränkung auf "Gesamtprojekt" ##  
	R = InputBox("Vorgabe eines Startwertes gewünscht (J/N)?", "Startwert vorgeben?", "N", xpos, ypos)  
	If UCase(Left(R, 1)) = "J" Then  
		Do
			'Buchstabe  
			sBaseParLetter = sBasePar
			sMin = "A"  
			sMax = "Z"  
			Do
				R = UCase(InputBox("Bitte den Buchstaben (" & _  
					sMin & " - " & sMax & ") eingeben!", "Buchstabe", , xpos, ypos))  
				If R <> "" Then	sBaseParLetter = Left(R, 1)  
			Loop Until sBaseParLetter >= sMin And sBaseParLetter <=sMax
			
			'Absatznummer  
			iBaseParNumber = iBasePar
			iMin = 0
			iMax = 9999
			Do
				R = InputBox("Bitte den Startwert für die Absatznummer (" & _  
					CStr(iMin) & " - " & CStr(iMax) & ") eingeben!", "Absatznummer", iBasePar, xpos, ypos)  
				If R <> "" Then If IsNumeric(R) Then iBaseParNumber = CInt(R)  
			Loop Until iBaseParNumber >= iMin And iBaseParNumber <= iMax

			'Laufende Nummer  
			lBaseTokenNumber = lBaseToken
			lMin = 0
			lMax = 999999
			Do
				R = InputBox("Bitte den Startwert für die laufende Nummer (" & _  
					CStr(lMin) & " - " & CStr(lMax) & ") eingeben!", "Laufende Nummer", lBaseToken, xpos, ypos)  
				If R <> "" Then	If IsNumeric(R) Then lBaseTokenNumber = CLng(R)  
			Loop Until lBaseTokenNumber >= lMin And lBaseTokenNumber <= lMax
			
			'Kontrolle  
			sBase = sBaseParLetter & Right(CStr(10000 + iBaseParNumber), 4) & sDelim & Right(CStr(1000000 + lBaseTokenNumber), 6)
			Do
				R = InputBox("Bitte eingeben: " & vbCrLF & vbCrLF & _  
					"J, um " & sBase & " als Startwert zu verwenden, " & vbCrLF & _  
					"N, um mit dem Standardwert zu starten, oder " & vbCrLF & _  
					"W, um die Eingabe des Startwertes zu wiederholen.", _  
					"Startwert bestätigen", "J", xpos, ypos)  
				sWahl = UCase(Left(R, 1))
			Loop Until sWahl = "J" Or sWahl = "N" Or sWahl = "W"  
			If sWahl = "N" Then  
				sBaseParLetter = sBasePar
				iBaseParNumber = iBasePar
				lBaseTokenNumber = lBaseToken
			End If
		Loop Until sWahl <> "W"  
		sBasePar = sBaseParLetter
		iBasePar = iBaseParNumber
		lBaseToken = lBaseTokenNumber
	End If
End If '## Einschränkung auf "Gesamtprojekt" ##  

sPar = Chr(Asc(sBasePar) - 1)
iPar = 10000 + iBasePar - 1
lToken = 1000000 + lBaseToken

'Logdatei erstellen  
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)  

'Dateien alphabetisch sortiert einlesen  
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")  
If Not oExec.StdOut.AtEndOfStream Then
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
	'Alle Dateien durchgehen  
	For Each sFileName In aFiles
		If Not bAll Then 'Zählung neu beginnen  
			sPar = sBasePar
			iPar = 10000 + iBasePar
			lToken = 1000000 + lBaseToken
			iLeer = 0
			bLUsed = False
		Else
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen  
			bLUsed = True
		End If
		'Datei behandeln ...  
		If sFileName <> "" Then  
			ProcessFile sPath & "\" & sFileName  
			'... und protokollieren  
			oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
				Right(CStr(lToken), 6) & " " & sFileName  
		End If
	Next
Else
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _  
		sPath & _
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"  
	WScript.Quit(1)
End If
oLog.Close
'WScript.Echo "Ersetzen abgeschlossen."  

Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""  
Do While Not oTheFile.AtEndOfStream
	sInL = oTheFile.ReadLine
	If sInL <> PAR Then 'Kein leerer Absatz  
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...  
			'... daher keine Aktion erforderlich.  
		Else 'LIMIT überschritten -> Buchstabenwechsel, ...  
			If bLUsed Then '... falls Buchstabe bereits verwendet wurde  
				If sPar < "Z" Then  
					sPar = Chr(Asc(sPar) + 1)
				Else
					sPar = "A"  
				End If
				iPar = iPar + 1
				bLUsed = False
			End If
		End If
		iLeer = 0 'Zählung Leerzeilen rücksetzen  

		'Zeile behandeln  
		aLine = Split(sInL, sToken, -1, vbTextCompare)
		sLine = aLine(0)
		For i = 1 To UBound(aLine)
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
				Right(CStr(lToken), 6) & sPost
			sLine = sLine & sTag & aLine(i)
			lToken = lToken + 1
			bLUsed = True
		Next
	Else 'Leerzeile  
		iLeer = iLeer + 1
		sLine = sInL
	End If

	If sOut <> "" Then  
		sOut = sOut & vbCrLF & sLine
	Else
		sOut = sLine
	End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben  
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
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
Fraenky
Fraenky 24.08.2007 um 20:37:49 Uhr
Goto Top
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. face-smile
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
bastla
bastla 25.08.2007 um 01:38:06 Uhr
Goto Top
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. face-wink

...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 ... face-wink
Nun wieder zu Realistischem:
'DynRep-Last.vbs  
Const LIMIT = 5
Const PAR = "\par"  
Const LOGFILE = "DynRep.log"  
Const PARAMFILE = "Parameter.txt"  

'Defaultwerte  
sBasePar = "A"  
iBasePar = 1
lBaseToken = 1
sBaseDelim = "_"  
sDelimAccept = "_-#|@" 'zulässige Trennzeichen, bei Bedarf ergänzen  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("WScript.Shell")  

If WScript.Arguments.Count > 0 Then
	sArg = WScript.Arguments(0)
	If fso.FileExists(sArg) Then 'Aufruf mit Übergabe einer Datei  
		sPath = fso.GetFile(sArg).Path
		sPath = Left(sPath, InStrRev(sPath, "\") - 1)  
	Else 'oder ev eines Ordners  
		If fso.FolderExists(sArg) Then sPath = fso.GetFolder(sArg).Path
	End If
End If
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog  
	Set oFolder = CreateObject("Shell.Application") _  
		.BrowseForFolder(0, "Ordner wählen", 16, 17)  
	If TypeName(oFolder) = "Nothing" Then  
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"  
		WScript.Quit(1)
	Else
		sPath = oFolder.Self.Path
	End If
End If

'Benutzereingaben  
sToken = InputBox("Welche Markierung soll ersetzt werden?", "Markierung")  
If MsgBox("Alle Dateien als Gesamtprojekt betrachten?", vbYesNo) = vbYes Then bAll = True  
sPre = InputBox("Falls ein Präfix verwendet werden soll, bitte eingeben!", "Präfix")  
sPost = InputBox("Falls ein Postfix verwendet werden soll, bitte eingeben!","Postfix")  

If bAll Then ' ## Einschränkung auf "Gesamtprojekt" ##  
	Do
		'Buchstabe  
		sBaseParLetter = sBasePar
		sMin = "A"  
		sMax = "Z"  
		'Absatznummer  
		iBaseParNumber = iBasePar
		iMin = 0
		iMax = 9999
		'Laufende Nummer  
		lBaseTokenNumber = lBaseToken
		lMin = 0
		lMax = 999999
		'Delimiter  
		sBaseDelimChar = sBaseDelim
	
		sBase = sBaseParLetter & Right(CStr(10000 + iBaseParNumber), 4) & sBaseDelimChar & Right(CStr(1000000 + lBaseTokenNumber), 6)
		R = InputBox("Startwert entsprechend dem Muster eingeben," & vbCrLF & _  
			"wobei führende Nullen bei den Nummern weggelassen werden können und" & vbCrLF & _  
			"das Trennzeichen aus der folgenden Liste stammen muss:" & vbCrLF & _  
			sDelimAccept, "Startwert", sBase, xpos, ypos)  

		bOK = True
		If R = "" Then  
			' bei leerer Eingabe oder Abbruch Defaultwerte verwenden, daher keine Änderung erforderlich  
		Else
			If Len(R) >= 2 Then 'mindestens Buchstabe und Trennzeichen könnten eingegeben worden sein  
				'Buchstaben prüfen  
				If UCase(Left(R, 1)) >= sMin And UCase(Left(R, 1)) <= sMax Then
					sBaseParLetter = UCase(Left(R, 1))
				Else
					bOK = False
				End If

				'Ziffer oder Trennzeichen  
				iDelimPos = 0
				For i = 2 To Len(R)
					If Not IsNumeric(Mid(R, i, 1)) Then
						If InStr(sDelimAccept, Mid(R, i, 1)) Then
							sBaseDelimChar = Mid(R, i, 1)
							iDelimPos = i
						Else
							bOK = False
							'### Beispiel für Fehlermeldung ###  
							'MsgBox "Das verwendete Trennzeichen " & Mid(R, i, 1) & " ist nicht zulässig!"  
							'### Beispiel für Fehlermeldung ###  
						End If
						Exit For
					End If
				Next
				
				Select Case iDelimPos 'abhängig von Position des Trennzeichens  
				Case 0, 1 'kein gültiges Trennzeichen enthalten; (1 eigentlich unmöglich)  
					bOK = False
				Case 2 'keine Absatznummer  
					If iDelimPos < Len(R) Then 'laufende Nummer  
						If IsNumeric(Mid(R, iDelimPos + 1)) Then
							lBaseTokenNumber = CLng(Mid(R, iDelimPos + 1, 6))
						Else
							bOK = False
						End If
					End If
				Case Len(R) 'Trennzeichen am Ende, daher keine laufende Nummer  
										If IsNumeric(Mid(R, 2, iDelimPos - 2)) Then
						If iDelimPos <= 6 Then
							iBaseParNumber = CStr(Mid(R, 2, iDelimPos - 2))
						Else
							iBaseParNumber = CStr(Mid(R, 2, 4))
						End If
					Else
						bOK = False
					End If 
				Case Else 'Absatznummer und laufende Nummer  
					If IsNumeric(Mid(R, 2, iDelimPos - 2)) Then
						If IsNumeric(Mid(R, iDelimPos + 1)) Then
							If iDelimPos <= 6 Then
								iBaseParNumber = CInt(Mid(R, 2, iDelimPos - 2))
							Else
								iBaseParNumber = CInt(Mid(R, 2, 4))
							End If
							lBaseTokenNumber = CLng(Mid(R, iDelimPos + 1, 6))
						Else
							bOK = False
						End If 
					Else
						bOK = False
					End If
				End Select
			Else
				bOK = False
			End If
		End If
	Loop Until bOK
	sBasePar = sBaseParLetter
	iBasePar = iBaseParNumber
	lBaseToken = lBaseTokenNumber
	sBaseDelim = sBaseDelimChar
End If '## Einschränkung auf "Gesamtprojekt" ##  

sPar = Chr(Asc(sBasePar) - 1)
iPar = 10000 + iBasePar - 1
lToken = 1000000 + lBaseToken
sDelim = sBaseDelim

'Logdatei erstellen  
Set oLog = fso.OpenTextFile(sPath & "\" & LOGFILE, 2, True)  

'Dateien alphabetisch sortiert einlesen  
Set oExec = objShell.Exec("%comspec% /c dir /b /on /a-d """ & sPath & "\*.rtf""")  
If Not oExec.StdOut.AtEndOfStream Then
	aFiles = Split(oExec.StdOut.ReadAll, vbCrLF)
	'Alle Dateien durchgehen  
	For Each sFileName In aFiles
		If Not bAll Then 'Zählung neu beginnen  
			sPar = sBasePar
			iPar = 10000 + iBasePar
			lToken = 1000000 + lBaseToken
			iLeer = 0
			bLUsed = False
		Else
			iLeer = LIMIT + 1 'Buchstabenwechsel erzwingen  
			bLUsed = True
		End If
		'Datei behandeln ...  
		If sFileName <> "" Then  
			ProcessFile sPath & "\" & sFileName  
			'... und protokollieren  
			oLog.WriteLine sPar & Right(CStr(iPar), 4) & sDelim & _
				Right(CStr(lToken), 6) & " " & sFileName  
		End If
	Next
Else
	WScript.Echo "Im angegebenen Ordner " & vbCrLF & vbCrLF & _  
		sPath & _
		vbCrLF & vbCrLF & " wurden keine rtf-Dateien gefunden!"  
	WScript.Quit(1)
End If
oLog.Close

'Parameter speichern (für Verabeitung in Batch wichtig: sToken in letzte Zeile schreiben)  
fso.OpenTextFile(sPath & "\" & PARAMFILE, 2, True).Write _  
	sPre & vbCrLF & sPost & vbCrLF & bAll & vbCrLf & sToken

Sub ProcessFile(sFile)
Set oTheFile = fso.OpenTextFile(sFile, 1)
sOut = ""  
Do While Not oTheFile.AtEndOfStream
	sInL = oTheFile.ReadLine
	If sInL <> PAR Then 'Kein leerer Absatz  
		If iLeer <= LIMIT Then 'Letzter Leerzeilenblock nicht lang genug, ...  
			'... daher keine Aktion erforderlich.  
		Else 'LIMIT überschritten -> Buchstabenwechsel, ...  
			If bLUsed Then '... falls Buchstabe bereits verwendet wurde  
				If sPar < "Z" Then  
					sPar = Chr(Asc(sPar) + 1)
				Else
					sPar = "A"  
				End If
				iPar = iPar + 1
				bLUsed = False
			End If
		End If
		iLeer = 0 'Zählung Leerzeilen rücksetzen  

		'Zeile behandeln  
		aLine = Split(sInL, sToken, -1, vbTextCompare)
		sLine = aLine(0)
		For i = 1 To UBound(aLine)
			sTag = sPre & sPar & Right(CStr(iPar), 4) & sDelim & _
				Right(CStr(lToken), 6) & sPost
			sLine = sLine & sTag & aLine(i)
			lToken = lToken + 1
			bLUsed = True
		Next
	Else 'Leerzeile  
		iLeer = iLeer + 1
		sLine = sInL
	End If

	If sOut <> "" Then  
		sOut = sOut & vbCrLF & sLine
	Else
		sOut = sLine
	End If
Loop
oTheFile.Close
'Neuen Dateiinhalt schreiben  
fso.OpenTextFile(sFile, 2, True).Write sOut
End Sub
Bei fehlerhaften Eingaben will ich Deine User auch nicht mit dem Wegklicken einer Fehlermeldung belasten face-wink, 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:
@echo on & setlocal
if not exist %1 goto :eof
cd /d "%~f1" 2>nul || cd /d "%~dp1"  

set "Bak=Sicherung"  
set "Param=Parameter.txt"  
set "List=DR.lst"  

set /a Nr=1001
set Datum=%date:~-4%-%date:~-7,2%-%date:~-10,2%
if not exist "%Bak%" md "%Bak%"  
if exist "%List%" del "%List%"  
for /f "delims=" %%i in ('dir /b /on /a-d *.rtf') do call :ProcessFile "%%i"  
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do copy "%%j" "%Bak%\%%j" & ren "%%j" %%i.rtf &   
C:\Skripts\DynRep-Last.vbs "%cd%"  
if exist "%Param%" for /f "usebackq delims=" %%i in ("%Param%") do set "Token=%%i"  
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist "%Bak%\%%j" move "%Bak%\%%j" "%Bak%\%%~nj_%Datum%_%Token%%%~xj"  
for /f "usebackq tokens=1* delims==" %%i in ("%List%") do if exist %%i.rtf move %%i.rtf "%%i_%%j"  
pause
goto :eof
:ProcessFile
(echo %Nr:~-3%=%~1)>>"%List%"  
set /a Nr+=1
goto :eof
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?
Fraenky
Fraenky 25.08.2007 um 10:17:42 Uhr
Goto Top
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. face-wink

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

Ok. face-smile


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

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
bastla
bastla 25.08.2007 um 11:58:47 Uhr
Goto Top
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":
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:
Set oParam = fso.OpenTextFile(sPath & "\" & PARAMFILE, 1)  
sPre = oParam.ReadLine
sPost = oParam.ReadLine
bAll = oParam.ReadLine
sToken = oParam.ReadLine
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 ... face-wink

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
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
Fraenky
Fraenky 25.08.2007 um 18:11:33 Uhr
Goto Top
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
bastla
bastla 25.08.2007 um 18:31:25 Uhr
Goto Top
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
Fraenky
Fraenky 25.08.2007 um 20:57:27 Uhr
Goto Top
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
bastla
bastla 25.08.2007 um 21:45:52 Uhr
Goto Top
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:
cd /d "D:\Dein\Arbeitsordner"  
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
If sPath = "" Then 'Kein (gültiger) Pfad übergeben, daher Dialog  
	Set oFolder = CreateObject("Shell.Application") _  
		.BrowseForFolder(0, "Ordner wählen", 16, 17)  
	If TypeName(oFolder) = "Nothing" Then  
		WScript.Echo "Kein gültiger Ordner angegeben  - Script wird beendet!"  
		WScript.Quit(1)
	Else
		sPath = oFolder.Self.Path
	End If
End If
auf die eine Zeile
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 face-wink - 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 face-wink).

Grüße
bastla
Fraenky
Fraenky 26.08.2007 um 10:35:56 Uhr
Goto Top
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
Fraenky
Fraenky 30.08.2007 um 10:21:33 Uhr
Goto Top
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
bastla
bastla 30.08.2007 um 10:51:37 Uhr
Goto Top
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:
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 ... face-wink

Grüße
bastla
Fraenky
Fraenky 30.08.2007 um 21:13:40 Uhr
Goto Top
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