Automatische Änderung einer bestimmten Zeile in einer Textdatei
Da ich bei uns im Betrieb eine neue DNC Box installieren musste (davor wurden CNC Programme auf Diskette gespeichert, Disketten gingen immer kaputt) und sie jetzt im LAN gespeichert werden, stehe ich vor folgendem Problem:
Wir haben eine ganz alte CNC Fräsmaschine (Böhringer, Bjh. 1981). Der Speicher der Maschine ist sehr begrenzt.
Die txt bzw. dnc Datei sieht folgender Maßen aus:
$$ (3859965)
%PM
N3859961 (SIEBKORB)
Der Dateiname lautet 3859965.dnc
Man sieht, dass in der dritten Zeile N3859961 (SIEBKORB) die falsche Nummer steht (da von anderem Programm an der Maschine kopiert), es muss N3859965 heißen, so wie der Dateiname oder die Nummer in der 1. Zeile.
An der Maschine selbst kann man das Programm nicht ändern(zu alt).
Es solte dann so sein:
$$ (3859965)
%PM
N3859965 (SIEBKORB)
Mein Chef reißt mir den Kopf ab, teure Hardware gekauft und jetzt wird die dritte Zeile falsch angezeigt, weil die Maschine keine Änderungen am Programm zulässt.
Gibt es vielleicht eine Möglichkeit, eine Batch zu schreiben? Alle Dateien sind in einem Ordner.Habe schon ganz google durch und weiß einfach nicht weiter.
Bin kurz vor dem Abschluss meiner Lehre und jetzt passiert sowas.
Hoffentlich kann mir da jemand helfen!
Wir haben eine ganz alte CNC Fräsmaschine (Böhringer, Bjh. 1981). Der Speicher der Maschine ist sehr begrenzt.
Die txt bzw. dnc Datei sieht folgender Maßen aus:
$$ (3859965)
%PM
N3859961 (SIEBKORB)
Der Dateiname lautet 3859965.dnc
Man sieht, dass in der dritten Zeile N3859961 (SIEBKORB) die falsche Nummer steht (da von anderem Programm an der Maschine kopiert), es muss N3859965 heißen, so wie der Dateiname oder die Nummer in der 1. Zeile.
An der Maschine selbst kann man das Programm nicht ändern(zu alt).
Es solte dann so sein:
$$ (3859965)
%PM
N3859965 (SIEBKORB)
Mein Chef reißt mir den Kopf ab, teure Hardware gekauft und jetzt wird die dritte Zeile falsch angezeigt, weil die Maschine keine Änderungen am Programm zulässt.
Gibt es vielleicht eine Möglichkeit, eine Batch zu schreiben? Alle Dateien sind in einem Ordner.Habe schon ganz google durch und weiß einfach nicht weiter.
Bin kurz vor dem Abschluss meiner Lehre und jetzt passiert sowas.
Hoffentlich kann mir da jemand helfen!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 31.08.2011 um 11:00:30 Uhr
Verschoben von "Windows"-"Netzwerk" nach "Batches from Hell"
Habe schon ganz google durch
Und ich habe hier schon 3 Millionen mal gesagt, ihr sollt nicht immer so übertreiben.Content-ID: 172339
Url: https://administrator.de/contentid/172339
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
134 Kommentare
Neuester Kommentar
Aloha,
wobei, du grüßt uns auch nicht - also aloha zurück.
greetz André
... wobei deinen Gruß finde ich auch nicht, hm eilig und dringend war es ja wieder, stimmt ja ... ich springe (erstmal ab hier)
wobei, du grüßt uns auch nicht - also aloha zurück.
Habe schon ganz google durch
Und dabei sind wir doch sehr weit oben gelistet ... aber warum habe ich das Gefühl, dass du unsere Suchfunktion noch nicht durchhast (batch Zeile ersetzen)Gibt es vielleicht eine Möglichkeit, eine Batch zu schreiben?
Ja, mit VBS-inliner.greetz André
... wobei deinen Gruß finde ich auch nicht, hm eilig und dringend war es ja wieder, stimmt ja ... ich springe (erstmal ab hier)
Servus,
Gruß
- wenn du den auch an jedem Tag Grußlos vorbeieilst, verstehe ich das
Habe schon ganz google durch.
- Und bei welchem Buchstaben bist du gelandet A wie Adminisrotor.de?
- Kleiner Tipp, kau Google nochmal einen Buchstaben weiter durch, das sollte B wie Batch sein
Bin kurz vor dem Abschluss meiner Lehre und jetzt passiert sowas.
- Tröste dich, gestern war einer da, der genauso aufgetreten ist (Doppelpost - nur hatte dessen 2. Post wenigstens einen Gruß vor dem "Auftrag" - ok nicht ganz freiwillig, aber who cares) und der hatte frisch das Strassenabretuhr gemacht.
Hoffentlich kann mir da jemand helfen!
- Wie weit bist du denn mit der Batch gekommen und wo hängst?
Gruß
Hi,
sieh doch einfach mal im Thread unten in die Liste unterhalb von "Mögliche Antworten oder verwandte Beiträge" oder klicke auf die Zeile. Da findest du sicher etwas, das dir einen ersten Ansatz ermöglicht.
Gruß
sieh doch einfach mal im Thread unten in die Liste unterhalb von "Mögliche Antworten oder verwandte Beiträge" oder klicke auf die Zeile. Da findest du sicher etwas, das dir einen ersten Ansatz ermöglicht.
Gruß
Zitat von @lordofremixes:
Stimmt, kein Gruß, sorry !
HALLO ERSTMAL ZUSAMMEN! danke auch für die schnelle Antwort !
Stimmt, kein Gruß, sorry !
HALLO ERSTMAL ZUSAMMEN! danke auch für die schnelle Antwort !
- ok ok...
- Denn suchen und ersetzen - egal ob Batch oder VBS ist immer mit Nebenwirkungen verbunden und in der Steuerdatei sind ganz sicher mehrere (und ganz andere) Sonderzeichen, als nur % und $...
Auch wenn dir das nicht aufällt, beim umschreiben kann man auch etwas umschreiben, das so nicht gewollt ist und wenn die gut abgehangene Böhringer dann wegen einer Reihe "falscher" Steuerbefehle mit Karacho gegen sich selbst fährt - sei mir sicher - dann reisst dir dein Chef nicht nur den Kopf, sondern zuerst jeden Fingernagel einzln raus.
- Spreche mit deinem Chef, deinem Lieferanten und kläre ab, was das kleinste Übel ist.
Gruß
- Hüstel..
Aber das ist doch viel zu kompliziert oder nicht? Es muss doch auch mit Batch gehen.
"DAS" ist Batch, bzw. die Sprache, die cmd.exe versteht.
Ich würde außerdem grob Tippen, das das ein "echter" oder mal von Bastla inspirietes Schnippselchen ist.
Ich dachte da soll
N3859965 (SIEBKORB)
rein..... Und die Datei heisst nicht xyz (SIEBKORB)
Aloha,
Wenn die batch imselben Verzeichnis wie .dnc-Dateien liegt, arbeitet es seine befindliche Verzeichnisebene durch, für jede auftretende .dnc-Datei und ersetzt dabei den Wert aus Zeile drei mit dem Wert aus Zeile eins.
edit Ach, der erste Wert == Dateiname, oh Mann, besser lesen, werde es gleich umbauen xD
Wenn der Wert aus Zeile 3 mehrfach vorkommt, macht das nichts, da hierbei nur der erste Fund ersetzt wird (ergo Zeile 3, da dies der erste Treffer ist).
greetz André
edit: Warum war das VBS-Erstellen eigentlich im Ablauf *grübel* ist doch sinnfrei
P.S.: @bastla ob der noch einmal hier reinguckt *grübel* immer wieder gut, deine inliner, vor allem, wenn man weiß, wo sie geschrieben stehen *gg*
@echo off & setlocal
set R=Replace.vbs
if not exist %R% >%R% echo Set fso=CreateObject("Scripting.FileSystemObject"):Set a=WScript.Arguments:T=fso.OpenTextFile(a(0)).ReadAll:fso.CreateTextFile(a(0)).Write Replace(T,a(1),a(2),1,1)
for %%s in (*.dnc) do call :Ablauf "%%s"
pause
goto :eof
:Ablauf
for /f "tokens=1 delims= " %%m in ('findstr /n "^" "%~1"^|findstr /B "3:"') do set "Alt=%%m"
set "Alt=%Alt:~2%"
cscript //nologo %R% %1 "%Alt%" "N%~n1"
goto :eof
Wenn die batch imselben Verzeichnis wie .dnc-Dateien liegt, arbeitet es seine befindliche Verzeichnisebene durch, für jede auftretende .dnc-Datei und ersetzt dabei den Wert aus Zeile drei mit dem Wert aus Zeile eins.
Wenn der Wert aus Zeile 3 mehrfach vorkommt, macht das nichts, da hierbei nur der erste Fund ersetzt wird (ergo Zeile 3, da dies der erste Treffer ist).
greetz André
edit: Warum war das VBS-Erstellen eigentlich im Ablauf *grübel* ist doch sinnfrei
P.S.: @bastla ob der noch einmal hier reinguckt *grübel* immer wieder gut, deine inliner, vor allem, wenn man weiß, wo sie geschrieben stehen *gg*
Hi @all,
das hier wäre meine Batch-Lösung gewesen:
Gruß
Friemler
das hier wäre meine Batch-Lösung gewesen:
@echo off & setlocal
::Quellverzeichnis
set "SrcDir=."
::Zielverzeichnis
set "DestDir=E:\Test"
::Zu verarbeitende Dateitypen
set "FileType=dnc"
::Alle Dateien des angegebenen Typs im Quellverzeichnis finden
::und im Unterprogramm ProcessFile verarbeiten
for %%f in ("%SrcDir%\*.%FileType%") do (
call :ProcessFile "%%f"
)
::Script Ende
exit /b
::Unterprogramm
:ProcessFile
::Erste Zeile der aktuellen Quelldatei einlesen
set /p "FirstLine=" < "%~1"
::Die Maschinen-Nummer (in runden Klammern eingeschlossen) extrahieren
for /f "tokens=2 delims=()" %%n in ("%FirstLine%") do (
set "MachineNo=%%n"
)
::Leere Zieldatei anlegen
type NUL > "%DestDir%\%MachineNo%.%FileType%"
::Alle Zeilen der aktuellen Quelldatei einlesen
(for /f "tokens=1* delims=:" %%l in ('findstr /n "^" "%~1"') do (
if %%l neq 3 (
rem Alle Zeilen ausser der 3. direkt in die Zieldatei schreiben
echo %%m
) else (
rem Aus der 3. Zeile die Maschinen-Nummer herausfiltern, die neue
rem Maschinen-Nummer einsetzen und alles in die Zieldatei schreiben
for /f "tokens=1* delims=0123456789" %%a in ("%%m") do (
echo %%a%MachineNo%%%b
)
)
)) >> "%DestDir%\%MachineNo%.%FileType%"
::Rücksprung ins Hauptprogramm
exit /b
Gruß
Friemler
Hallo lordofremixes,
das Input- und das Outputverzeichnis müssen verschieden sein. Das war auch meine Absicht, damit die Originaldateien nicht überschrieben werden.
Zu Deiner Frage mit dem Überwachen des Verzeichnisses auf neue Dateien: Wenn Du die Programmdateien einmalig änderst, warum ist es dann immer noch möglich, dass ein Arbeiter an einer Maschine eine fehlerhafte Version hat? Ich habe Dein Eröffnungsposting so verstanden, dass die Programme ab sofort über das Netzwerk geladen werden, eben aus dem Verzeichnis mit den korrigierten Versionen.
Gruß
Friemler
das Input- und das Outputverzeichnis müssen verschieden sein. Das war auch meine Absicht, damit die Originaldateien nicht überschrieben werden.
Zu Deiner Frage mit dem Überwachen des Verzeichnisses auf neue Dateien: Wenn Du die Programmdateien einmalig änderst, warum ist es dann immer noch möglich, dass ein Arbeiter an einer Maschine eine fehlerhafte Version hat? Ich habe Dein Eröffnungsposting so verstanden, dass die Programme ab sofort über das Netzwerk geladen werden, eben aus dem Verzeichnis mit den korrigierten Versionen.
Gruß
Friemler
Zitat von @lordofremixes:
Also, dass die batch Datei den ganzen Tag läuft und er nur korrigiert, wenn er eine neue Datei reinbekommt? Sonst müsste man immer die Datei starten und sie würde 9800 dnc Dateien durchforsten.
Also, dass die batch Datei den ganzen Tag läuft und er nur korrigiert, wenn er eine neue Datei reinbekommt? Sonst müsste man immer die Datei starten und sie würde 9800 dnc Dateien durchforsten.
Hm, die Frage taucht öfter vor, mir will nur keine schnelle Lösung einfallen, irgendwo im Forum muss dazu schon etwas existieren, ich guck erst nach dem Mittagessen wieder rein
Am Einfachsten wäre es, alle Dateien nach der Bearbeitung zu verschieben, sprich zwei Verzeichnisse zu haben, Eingang und Ausgang, somit wird nur Eingang überprüft (batch im Task/Aufgabenplanung) und bearbeitet und in Ausgang liegen die fertigen Dateien.
greetz André
[OT]
Moin LordofPürierstab,
willkommen im Forum.
Geht mich ja nix an, aber...
Da kannst hier im Forum fragen, wen du willst - ich achte ja schon sehr auf die Einhaltung der Gender(und Genderinnen)-Richtlinien.
Aber selbst ich bin bis heute total gedankenlos darüber hinweggegangen, dass Monate auf diesem Planeten immer nur einen Ultimo haben und keine Ultima.
Ich werde in Zukunft mehr auf meine Formulierungen achten.
Das ist mir am heutigen Ultimo bzw. der heutigen Ultima klargeworden.
Grüße
Biber
[/OT]
Moin LordofPürierstab,
willkommen im Forum.
Geht mich ja nix an, aber...
Da kannst hier im Forum fragen, wen du willst - ich achte ja schon sehr auf die Einhaltung der Gender(und Genderinnen)-Richtlinien.
Aber selbst ich bin bis heute total gedankenlos darüber hinweggegangen, dass Monate auf diesem Planeten immer nur einen Ultimo haben und keine Ultima.
Ich werde in Zukunft mehr auf meine Formulierungen achten.
Das ist mir am heutigen Ultimo bzw. der heutigen Ultima klargeworden.
Grüße
Biber
[/OT]
[OT]
Moin, Biber
sein nachsichtig, er hat doch nur das ratio unterschlagen.
Gruß
[/OT]
Moin, Biber
sein nachsichtig, er hat doch nur das ratio unterschlagen.
Gruß
[/OT]
Ein bisschen Eigeninitiative könntest du ja auch entwickeln. Dann durchsuchst du halt nur die Dateien, deren Archivbit gesetzt ist und setzt nach der Änderung durch die Batchdatei gleich das Archivbit wieder zurück.
Aber nein, hier wird ja immer alles brühwarm aufbereitet und vorgekaut, damit sich niemand selbst Mühe zu geben braucht. Zum Kotzen .......
Aber nein, hier wird ja immer alles brühwarm aufbereitet und vorgekaut, damit sich niemand selbst Mühe zu geben braucht. Zum Kotzen .......
Hallo lordofremixes,
schau Dir mal diesen Thread an, dort habe ich einen Installer für einen WMI Permanent Event Consumer veröffentlicht, der ein Verzeichnis auf neu erstellte Dateien eines bestimmten Typs überwacht und jedesmal ein VBScript aufruft, wenn das passiert. Das im obigen Thread aufgerufene Script ist für Dich natürlich untauglich. Dazu müsste Skyemugen (?) eine Pure-VBScript Version seiner Lösung erstellen. Außerdem müssen im Installer noch 3 Zeilen angepasst werden. Ich habe heute zu wenig Zeit, um mich darum zu kümmern. Meine Erklärungen in obigem Thread sollten aber weiterhelfen.
Gruß
Friemler
schau Dir mal diesen Thread an, dort habe ich einen Installer für einen WMI Permanent Event Consumer veröffentlicht, der ein Verzeichnis auf neu erstellte Dateien eines bestimmten Typs überwacht und jedesmal ein VBScript aufruft, wenn das passiert. Das im obigen Thread aufgerufene Script ist für Dich natürlich untauglich. Dazu müsste Skyemugen (?) eine Pure-VBScript Version seiner Lösung erstellen. Außerdem müssen im Installer noch 3 Zeilen angepasst werden. Ich habe heute zu wenig Zeit, um mich darum zu kümmern. Meine Erklärungen in obigem Thread sollten aber weiterhelfen.
Gruß
Friemler
Aloha Kaputtnick,
der Gedanke ist wirklich nicht dumm, daran hatte ich selbst nicht gedacht.
Default müsste das Attribut ja vorhanden sein, sodass das Skript in Zeile 05 in
geändert und nach Zeile 13 (vor 14) dann
hinzugefügt werden müsste.
greetz André
P.S.:@Friemler
joke one das würde ich wenn dann bastla oder dir überlassen *gg*
der Gedanke ist wirklich nicht dumm, daran hatte ich selbst nicht gedacht.
Default müsste das Attribut ja vorhanden sein, sodass das Skript in Zeile 05 in
for /f "delims=" %%s in ('dir /b /AA *.dnc') do call :Ablauf "%%s"
attrib -A %1
greetz André
P.S.:@Friemler
Dazu müsste Skyemugen (?) eine Pure-VBScript Version seiner Lösung erstellen
Nice
Aloha,
Friemler sagte nicht, dass ein Fehler vorhanden sei, sondern das Skript für seine erweiterte Lösung
Pure-VB-Script ist ein komplettes .vbs-Skript also keine Batch mehr (die wie hier einen .vbs-inliner nutzt).
greetz André
Friemler sagte nicht, dass ein Fehler vorhanden sei, sondern das Skript für seine erweiterte Lösung
untauglich
ist, sprich: Nicht im Zusammenspiel verwendet werden kann (außer man baut noch mehr rum).Pure-VB-Script ist ein komplettes .vbs-Skript also keine Batch mehr (die wie hier einen .vbs-inliner nutzt).
greetz André
Hallo lordofremixes,
dass die Lösung von Skyemugen nicht funktioniert habe ich nie behauptet. Im Gegenteil, wenn ich sie mir anschaue, wird sie ganz sicher funktionieren. Sie ist aber in Batchscript geschrieben und enthält nur einen Schnipsel VBScript zum Austausch der Maschinen-Nummer. Der Event Consumer aus dem genannten Thread kann aber nur VBScript-Dateien starten, das umzubauen wäre zu viel Aufwand.
In Zeile 13 wird nicht das Script eingetragen, das aufgerufen werden soll. Hier wird ein String eingetragen, unter dem der Permanent Event Consumer und der zugehörige Filter bei WMI registriert wird. Aus dem String ergibt sich außerdem der Name des VBScripts, das beim Auslösen aufgerufen wird (die Leerzeichen in dem String werden entfernt und zusätzlich "EventHandler.vbs" angehängt).
Ließ dir bitte in dem Thread auch dieses Posting gründlich durch, dort ist alles nochmal genau erklärt.
Was meinst Du mit
Gruß
Friemler
dass die Lösung von Skyemugen nicht funktioniert habe ich nie behauptet. Im Gegenteil, wenn ich sie mir anschaue, wird sie ganz sicher funktionieren. Sie ist aber in Batchscript geschrieben und enthält nur einen Schnipsel VBScript zum Austausch der Maschinen-Nummer. Der Event Consumer aus dem genannten Thread kann aber nur VBScript-Dateien starten, das umzubauen wäre zu viel Aufwand.
In Zeile 13 wird nicht das Script eingetragen, das aufgerufen werden soll. Hier wird ein String eingetragen, unter dem der Permanent Event Consumer und der zugehörige Filter bei WMI registriert wird. Aus dem String ergibt sich außerdem der Name des VBScripts, das beim Auslösen aufgerufen wird (die Leerzeichen in dem String werden entfernt und zusätzlich "EventHandler.vbs" angehängt).
Ließ dir bitte in dem Thread auch dieses Posting gründlich durch, dort ist alles nochmal genau erklärt.
Was meinst Du mit
Gruß
Friemler
Nur noch einmal als Wink mit dem Zaunpfahl, eventuell ist der Kommentar untergegangen bei der Threadstruktur
Attributsnutzung für nicht-alle-immer-wieder-durchkauen
Hatte auf Kaputtnicks Kommentar geantwortet, daher steht es jetzt mitten im Nirvana ^_^
greetz André
Hallo lordofremixes,
ich habe doch noch Zeit gefunden, das Eventhandler Script zu schreiben. Beachte die Regeln zur Namensgebung, die im Thread mit dem Event Consumer angegeben sind.
Gruß
Friemler
ich habe doch noch Zeit gefunden, das Eventhandler Script zu schreiben. Beachte die Regeln zur Namensgebung, die im Thread mit dem Event Consumer angegeben sind.
'Eine Konstante definieren
Const ForReading = 1
'Pfad und Name der als Parameter übergebenen
'neu erstellten Datei in Variable einlesen
strFileName = WScript.Arguments(0)
'Dateisystem-Objekt erzeugen
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Dateiinhalt komplett in einen String einlesen
Set objInFile = objFSO.OpenTextFile(strFileName, ForReading, False)
strContent = objInFile.ReadAll
objInFile.Close
'Den String anhand des Zeilenumbruchs in ein Array zerlegen,
'dessen Elemente die einzelnen Zeilen enthalten.
arrContent = Split(strContent, vbCrLf)
'Objekt für Reguläre Ausdrücke erzeugen
Set objRegExp = New RegExp
'Nur den ersten Treffer zurückliefern
objRegExp.Global = False
'Suchmuster für die Maschinen-Nummer in Zeile 1 der Eingabedatei
objRegExp.Pattern = "\(([0-9]*)\)"
'Die Maschinen-Nummer extrahieren
strNewMachineNo = objRegExp.Execute(arrContent(0))(0).SubMatches(0)
'Suchmuster für den Aufbau der kompletten Zeile 3
objRegExp.Pattern = "(N)([0-9]*)( .*)"
'Maschinen-Nummer austauschen
arrContent(2) = objRegExp.Replace(arrContent(2), "$1" & strNewMachineNo & "$3")
'Aus dem Array wieder einen String machen, die einzelnen
'Arrayelemente durch Zeilenumbrüche voneinander trennen
'und den String in die ursprüngliche Datei schreiben.
'Der alte Inhalt wird dabei überschrieben.
Set objOutFile = objFSO.CreateTextFile(strFileName, True)
objOutFile.Write Join(arrContent, vbCrLf)
objOutFile.Close
Gruß
Friemler
Aloha,
das wäre durchaus eine mögliche Lösung, denn da bei der Bearbeitung das Archivattribut am Ende gelöscht wird, wird es beim nächsten Durchgang nicht mehr mit aufgelistet, also nicht erneut durchgearbeitet - wenn man die batch dann als Aufgabe / Task aktiviert im X-Minuten-Zyklus, hätte man eine stetige (wenn auch natürlich etwas verzögerte) Abarbeitung der gesamten Situation
Oder du nimmst Friemlers Durcharbeitung ^_^
greetz André
das wäre durchaus eine mögliche Lösung, denn da bei der Bearbeitung das Archivattribut am Ende gelöscht wird, wird es beim nächsten Durchgang nicht mehr mit aufgelistet, also nicht erneut durchgearbeitet - wenn man die batch dann als Aufgabe / Task aktiviert im X-Minuten-Zyklus, hätte man eine stetige (wenn auch natürlich etwas verzögerte) Abarbeitung der gesamten Situation
Oder du nimmst Friemlers Durcharbeitung ^_^
greetz André
Hallo lordofremixes,
Du machst jetzt folgendes:
Wenn nun eine DNC-Datei in dem überwachten Verzeichnis angelegt wird, wird das Eventhandler Script ausgeführt. Davon sieht man aber nichts.
Das Installer Script kannst Du jetzt löschen, es wird nicht mehr benötigt.
Gruß
Friemler
Du machst jetzt folgendes:
- Den Installer für den Permanent Event Consumer z.B. unter
Installer.vbs
speichern. - Den Installer für den Permanent Event Consumer anpassen. Z.B.
strEventDescription = "New DNC File Creation"
strMonitorFileSpec = "Pfad zum Verzeichnis, das überwacht werden soll\*.DNC"
strPollingIntervall = "1"
- Das obige Eventhandler Script in diesem Fall unter dem Namen
NewDNCFileCreationEventHandler.vbs
speichern. - Die beiden Scripte in ein Verzeichnis kopieren, am besten in ein neu erstelltes Unterverzeichnis von
C:\Programme
. - Auf einer Windows-Version ab Vista ein Konsolenfenster (CMD.exe) mit
Rechtsklick -> Als Administrator ausführen
öffnen. Unter XP/Server2003 genügt es, CMD.exe einfach zu starten. In beiden Fällen mußt Du aber unter einem Administrator-Konto angemeldet sein. - Mit
CD
in das Verzeichnis wechseln, in dem Du die Scripte abgelegt hast. - Dann folgenden Befehl eingeben:
cscript /nologo Installer.vbs
. Es erscheint bei fehlerfreier Ausführung keine Meldung auf dem Schirm.
Wenn nun eine DNC-Datei in dem überwachten Verzeichnis angelegt wird, wird das Eventhandler Script ausgeführt. Davon sieht man aber nichts.
Das Installer Script kannst Du jetzt löschen, es wird nicht mehr benötigt.
Gruß
Friemler
Aloha,
1. Friemler arbeitet nicht mit meinem Skript (zusammen)
2. entferne einfach den Befehl
greetz André
P.S.: Mehrfachzeitplan lautet im Taskplaner das Stichwort, da muss man sich schon arbeit machen *gg* - man kann natürlich auch die batch dauerlaufen lassen, indem man sie immer wieder zum Anfang springen lässt und nie aufhört (evtl. noch mit ping localhost oder sleep.exe)
1. Friemler arbeitet nicht mit meinem Skript (zusammen)
2. entferne einfach den Befehl
pause
...greetz André
P.S.: Mehrfachzeitplan lautet im Taskplaner das Stichwort, da muss man sich schon arbeit machen *gg* - man kann natürlich auch die batch dauerlaufen lassen, indem man sie immer wieder zum Anfang springen lässt und nie aufhört (evtl. noch mit ping localhost oder sleep.exe)
Hallo lordofremixes,
die Idee, im Hintergrund ständig ein Batchscript laufen zu lassen, um das Verzeichnis zu überwachen, ist keine gute. Das erzeugt eine immens hohe Prozessorlast (ca. 60%). Du hast von mir einen funktionierenden Vorschlag mit ausführlicher Anleitung (siehe hier). Ich rate Dir, diese auch zu nutzen.
Gruß
Friemler
die Idee, im Hintergrund ständig ein Batchscript laufen zu lassen, um das Verzeichnis zu überwachen, ist keine gute. Das erzeugt eine immens hohe Prozessorlast (ca. 60%). Du hast von mir einen funktionierenden Vorschlag mit ausführlicher Anleitung (siehe hier). Ich rate Dir, diese auch zu nutzen.
Gruß
Friemler
Hallo lordofremixes,
Du musst nichts in den Autostartordner packen. Der Event Consumer ist Permanent installiert, die Registrierung bleibt auch nach einem Reboot erhalten. Das ganze läuft jetzt einfach bis zur nächsten Neuinstallation. Um Benutzerrechte brauchst Du Dir auch keine Gedanken zu machen. Das Eventhandler Script wird unter dem SYSTEM-Konto ausgeführt, der angemeldete Benutzer hat damit nichts zu tun.
Gruß
Friemler
Du musst nichts in den Autostartordner packen. Der Event Consumer ist Permanent installiert, die Registrierung bleibt auch nach einem Reboot erhalten. Das ganze läuft jetzt einfach bis zur nächsten Neuinstallation. Um Benutzerrechte brauchst Du Dir auch keine Gedanken zu machen. Das Eventhandler Script wird unter dem SYSTEM-Konto ausgeführt, der angemeldete Benutzer hat damit nichts zu tun.
Gruß
Friemler
Hi André,
ob SLEEP die Prozessorlast vermindert habe ich noch nicht ausprobiert, könnte aber gut sein. Ich löse sowas mittlerweile immer mit den Permanent Event Consumern, weil man alles möglich im System "monitoren" kann, je nach Konfiguration des Event Filters. Die von mir genannten 60% Prozessorauslastung basieren auf mehreren Erfahrungen vor längerer Zeit.
Gruß
Friemler
ob SLEEP die Prozessorlast vermindert habe ich noch nicht ausprobiert, könnte aber gut sein. Ich löse sowas mittlerweile immer mit den Permanent Event Consumern, weil man alles möglich im System "monitoren" kann, je nach Konfiguration des Event Filters. Die von mir genannten 60% Prozessorauslastung basieren auf mehreren Erfahrungen vor längerer Zeit.
Gruß
Friemler
[OT]
Hallo Biber,
entschuldige meine Entgleisung und danke fürs Löschen. Aber beim Lesen der meisten Kommentare von Kaputtnick habe ich schon des öfteren eine Schwellung am Hals verspürt .
Das hat er ja schon hier kundgetan.
Gruß
Friemler
[/OT]
Hallo Biber,
entschuldige meine Entgleisung und danke fürs Löschen. Aber beim Lesen der meisten Kommentare von Kaputtnick habe ich schon des öfteren eine Schwellung am Hals verspürt .
Das hat er ja schon hier kundgetan.
Gruß
Friemler
[/OT]
Zitat von @lordofremixes:
habe es mit phase geöffnet, alle zeilen nummern rausgelöscht und als installer.vbs gespeichert.
habe es mit phase geöffnet, alle zeilen nummern rausgelöscht und als installer.vbs gespeichert.
Zeilennummern löschen ... guck mal rechts oben bei Codeblöcken
da gibt es:
Quelltext | in den Speicher kopieren | drucken ...
und zwar ohne Zeilennummern ...
greetz André
P.S.: Die ständigen mehrfachpostings sind Horror, ernsthaft, gewöhne dir bitte ein edit oder horizontale Linien (siehe Formatierungshilfe - ist in roter Schrift über einem Kommentarerstellungsfenster zu sehen) zu nutzen, das tut uns allen gut und auch der Übersicht, die hier eh schon verloren ist.
edit: too late (wenn man mal wieder abgelenkt wird, har har)
Hallo lordofremixes,
es werden nicht jedesmal alle Dateien in dem Verzeichnis geprüft. Nur wenn eine Datei neu erstellt wurde, wird das Eventhandler Script aufgerufen, was dann genau diese Datei bearbeitet.
Ich kann Dir jetzt nur noch raten, die Anleitung nochmal genau durchzugehen. Das Eventhandler Script muss in dem Verzeichnis bleiben, in das Du es zusammen mit dem Installer Script kopiert hast, bevor Du den Installer gestartet hast.
Außerdem müsste Dein Testrechner jetzt noch "gesäubert" werden. Sonst hast Du für alle Zeiten einen Permanent Event Consumer laufen, der ein nicht existierendes Verzeichnis überwacht und/oder das auszuführende Eventhandler Script nicht mehr findet (hast Du ja wahrscheinlich beides gelöscht). Melde Dich deswegen nochmal.
[EDIT]
Ich glaube die Fettschrift hier ist Deine Schuld und durch das erste Posting des Event Consumer Codes entstanden (irgendwelche HTML-Tags reingerutscht?). Schau da bei Gelegenheit noch mal mit der Bearbeiten-Funktion drüber.
[/EDIT]
Gruß
Friemler
es werden nicht jedesmal alle Dateien in dem Verzeichnis geprüft. Nur wenn eine Datei neu erstellt wurde, wird das Eventhandler Script aufgerufen, was dann genau diese Datei bearbeitet.
Ich kann Dir jetzt nur noch raten, die Anleitung nochmal genau durchzugehen. Das Eventhandler Script muss in dem Verzeichnis bleiben, in das Du es zusammen mit dem Installer Script kopiert hast, bevor Du den Installer gestartet hast.
Außerdem müsste Dein Testrechner jetzt noch "gesäubert" werden. Sonst hast Du für alle Zeiten einen Permanent Event Consumer laufen, der ein nicht existierendes Verzeichnis überwacht und/oder das auszuführende Eventhandler Script nicht mehr findet (hast Du ja wahrscheinlich beides gelöscht). Melde Dich deswegen nochmal.
[EDIT]
Ich glaube die Fettschrift hier ist Deine Schuld und durch das erste Posting des Event Consumer Codes entstanden (irgendwelche HTML-Tags reingerutscht?). Schau da bei Gelegenheit noch mal mit der Bearbeiten-Funktion drüber.
[/EDIT]
Gruß
Friemler
Hallo lordofremixes,
in Deinem letzten Posting des Installer Codes habe ich gerade gesehen, dass Du in Zeile 137 statt
diese Zeile
stehen hast. Letzteres ist falsch.
Ich hoffe, Du hast den Quelltext richtig kopiert (durch klick auf den Link "Quelltext" am oberen rechten Rand der Codebox).
Ich sagte ja schon, dass man die Codeformatierung auch nachträglich in ein Posting einfügen kann. Trotz aller Hektik: Bitte ruhig bleiben und die Helfenden unterstützen.
Gruß
Friemler
in Deinem letzten Posting des Installer Codes habe ich gerade gesehen, dass Du in Zeile 137 statt
Set objFilterClass = objWMIService.Get("__EventFilter")
Set objFilterClass = objWMIService.Get("EventFilter")
Ich hoffe, Du hast den Quelltext richtig kopiert (durch klick auf den Link "Quelltext" am oberen rechten Rand der Codebox).
Ich sagte ja schon, dass man die Codeformatierung auch nachträglich in ein Posting einfügen kann. Trotz aller Hektik: Bitte ruhig bleiben und die Helfenden unterstützen.
Gruß
Friemler
Zitat von @Friemler:
[EDIT]
Ich glaube die Fettschrift hier ist Deine Schuld und durch das erste Posting des Event Consumer Codes entstanden (irgendwelche
HTML-Tags reingerutscht?). Schau da bei Gelegenheit noch mal mit der Bearbeiten-Funktion drüber.
[/EDIT]
[EDIT]
Ich glaube die Fettschrift hier ist Deine Schuld und durch das erste Posting des Event Consumer Codes entstanden (irgendwelche
HTML-Tags reingerutscht?). Schau da bei Gelegenheit noch mal mit der Bearbeiten-Funktion drüber.
[/EDIT]
[OT]
Das ist das zweite Mal seit ich hier angemeldet bin, dass dieses Phänomen auftritt, damals war es auch nicht mehr rückgängig zu machen, selbst wenn man den Code, nachdem es anfing, gelöscht hat :D freu dich auf Dauerfett (oder schreibe in Codeplain *gg* - ist zwar auch fett aber etwas weniger aufdringlich )
[/OT]
Testkommentar um zu sehen, ob nur ab einer Struktur der Fett-Bug auftritt ... (direkt auf EP geantwortet)
hm so einfach geht's nicht auszutricksen, na gut - ein Fall für das Löschen dann
P.S.: Kommentare die vor dem Bugpost landen, bleiben normal also alles, das vor der Struktur von 16:45:31 Uhr landet Beweis
P.P.S.: er lernt es nicht mit den Codetags ...
late edit: Wer hat das Fett verbraten?
hm so einfach geht's nicht auszutricksen, na gut - ein Fall für das Löschen dann
P.S.: Kommentare die vor dem Bugpost landen, bleiben normal also alles, das vor der Struktur von 16:45:31 Uhr landet Beweis
P.P.S.: er lernt es nicht mit den Codetags ...
late edit: Wer hat das Fett verbraten?
Hallo lordofremixes,
Du brauchst nur auf den schon MEHRMALS angegebenen zu klicken um zu sehen, wie Du die Codeformatierung aktivierst: Einfach den Quellcode in Tags einschließen.
Gruß
Friemler
Zitat von @lordofremixes:
Mit der Codeformatierung , habe bei Formatierungshilfe geschaut aber den Code für die Zeilennummerierung finde ich nicht (zu spät?).
Mit der Codeformatierung , habe bei Formatierungshilfe geschaut aber den Code für die Zeilennummerierung finde ich nicht (zu spät?).
Du brauchst nur auf den schon MEHRMALS angegebenen zu klicken um zu sehen, wie Du die Codeformatierung aktivierst: Einfach den Quellcode in Tags einschließen.
Gruß
Friemler
Siehe dieses Posting.
Vielen Dank! Hektik ist ein schlechter Partner in der IT.
Hast Du Zeile 69
im Listing des Installers verbessert oder sind die führenden Tiefstriche vor
Gruß
Friemler
Hast Du Zeile 69
Set objFilterClass = objWMIService.Get("__EventFilter")
EventFilter
erst durch die Codeformatierung aufgetaucht? So sollte es richtig sein.Gruß
Friemler
Hallo lordofremixes,
ich habe gerade die Listings aus Deinen letzten (endlich mit Codeformatierung versehenen ) Postings genommen, die von Dir angegebene Verzeichnisstruktur erstellt und den Installer aus
[EDIT]
Test auf einer VM mit XP SP3 wiederholt. Funktioniert auch.
[/EDIT]
Gruß
Friemler
ich habe gerade die Listings aus Deinen letzten (endlich mit Codeformatierung versehenen ) Postings genommen, die von Dir angegebene Verzeichnisstruktur erstellt und den Installer aus
C:\CNC Programme DNC
(hattest Du zwar anders angegeben, aber das schiebe ich mal auf Deine Hektik) laufen lassen. Testsystem: Windows 7 Ultimate SP1. Nachdem ich eine fehlerhafte DNC-Datei mit dem Inhalt aus Deinem Eröffnungsposting in das überwachte Verzeichnis C:\CNC Programme DNC\M1
kopiert habe, wurde diese korrigiert.[EDIT]
Test auf einer VM mit XP SP3 wiederholt. Funktioniert auch.
[/EDIT]
Gruß
Friemler
Hallo lordofremixes,
evtl. muss der Rechner nach Deinen vielen Versuchen erst mal "gesäubert" werden (fehlerhafte Event Consumer, Event Filter, FilterToConsumerBindings). Die folgende Anleitung ist auch für Deinen Testrechner im Büro anwendbar.
Danach kannst Du ja noch mal testen (nimm als zu überwachendes Verzeichnis das mit den 9800 Dateien) und erhöhe das Pollingintervall, z.B. auf 10 (Sekunden).
[EDIT]
Anleitung aktualisiert, weil die Forensoftware unbeabsichtigte Formatierungen erzeugt hat, sodass führende Tiefstriche verloren gingen.
[/EDIT]
Gruß
Friemler
evtl. muss der Rechner nach Deinen vielen Versuchen erst mal "gesäubert" werden (fehlerhafte Event Consumer, Event Filter, FilterToConsumerBindings). Die folgende Anleitung ist auch für Deinen Testrechner im Büro anwendbar.
- Unter einem Konto anmelden, das zur Gruppe der Administratoren gehört.
- Starte über
Rechtsklick -> Als Administrator ausführen
ein Konsolenfenster mit Adminrechten (für XP nicht erforderlich). - Gib dort den Befehl
wbemtest
ein. - Klicke im Fenster dieses Programms rechts oben auf
Verbinden...
. - Ändere den Inhalt des Eingabefeldes unter
Namespace
(ganz oben) aufroot\subscription
und klicke rechts oben aufVerbinden
. - Klicke jetzt im Hauptfenster auf
Instanzen aufzählen...
. - Trage unter
Name der übergeordneten Klasse
den Begriff __FilterToConsumerBinding ein (genau so, mit den zwei führenden Tiefstrichen!) und klicke aufOK
. - In der erscheinenden Liste ist unter Windows 7 und XP (evtl. auch Vista) ein Eintrag __FilterToConsumerBinding.Consumer="NTEventLogEventConsumer.Name=\"SCM Event Log Consumer\"", Filter="__EventFilter.Name=\"SCM Event Log Filter\"" zu sehen. Dieser MUSS erhalten bleiben. Die anderen Einträge überprüfen, ob sie von Deinen Tests stammen könnten (unter XP gibt es noch einen Standardeintrag), wenn ja, durch anklicken markieren und dann auf den Button
Löschen
klicken. Zum Schluss rechts oben aufSchließen
klicken. - Wiederum im Hauptfenster auf
Instanzen aufzählen...
klicken. - Trage unter
Name der übergeordneten Klasse
den Begriff __EventFilter ein (genau so, mit den zwei führenden Tiefstrichen!) und klicke aufOK
. - In der erscheinenden Liste ist unter Windows 7 und XP (evtl. auch Vista) ein Eintrag __EventFilter.Name="SCM Event Log Filter" zu sehen. Dieser MUSS erhalten bleiben. Die anderen Einträge überprüfen, ob sie von Deinen Tests stammen könnten (unter XP gibt es noch einen Standardeintrag), wenn ja, durch anklicken markieren und dann auf den Button
Löschen
klicken. Zum Schluss rechts oben aufSchließen
klicken. - Wiederum im Hauptfenster auf
Instanzen aufzählen...
klicken. - Trage unter
Name der übergeordneten Klasse
den BegriffCommandLineEventConsumer
ein und klicke aufOK
. - Die erscheinende Liste ist unter Windows 7 und XP (evtl. auch Vista) normalerweise leer. Überprüfe die vorhandenen Einträge, ob sie von Deinen Tests stammen könnten, wenn ja, durch anklicken markieren und dann auf den Button
Löschen
klicken. Zum Schluss rechts oben aufSchließen
klicken. - Jetzt ist alles deinstalliert. Im Hauptfenster rechts oben auf
Beenden
klicken.
Danach kannst Du ja noch mal testen (nimm als zu überwachendes Verzeichnis das mit den 9800 Dateien) und erhöhe das Pollingintervall, z.B. auf 10 (Sekunden).
[EDIT]
Anleitung aktualisiert, weil die Forensoftware unbeabsichtigte Formatierungen erzeugt hat, sodass führende Tiefstriche verloren gingen.
[/EDIT]
Gruß
Friemler
@Skyemugen
"Hochgeschätzt" macht mich ja wirklich fast verlegen (Biber würde mich übrigens eher "breit" schätzen ) ...
... aber die Lorbeeren hätten eigentlich an den noch mehr zu schätzenden hier) - darauf, dass ich in diesem Fall nix dafür kann, deutet übrigens "
Grüße
bastla
P.S.: Ich wollte auch noch mit in den Bereich, in dem Mann nicht fett rüberkommt ...
"Hochgeschätzt" macht mich ja wirklich fast verlegen (Biber würde mich übrigens eher "breit" schätzen ) ...
... aber die Lorbeeren hätten eigentlich an den noch mehr zu schätzenden hier) - darauf, dass ich in diesem Fall nix dafür kann, deutet übrigens "
move /y
" (den in einem Batch unnötigen Schalter verwende ich seit mindestens 4 Jahren nicht mehr) hin ...Grüße
bastla
P.S.: Ich wollte auch noch mit in den Bereich, in dem Mann nicht fett rüberkommt ...
@bastla
Grüße
Biber
Zitat von @bastla:
@Skyemugen
"Hochgeschätzt" macht mich ja wirklich fast verlegen (Biber würde mich übrigens eher "breit" schätzen ) ...
Biber würde sagen: Nicht nur grosse Ereignisse werfen ihre Schatten voraus @Skyemugen
"Hochgeschätzt" macht mich ja wirklich fast verlegen (Biber würde mich übrigens eher "breit" schätzen ) ...
P.S.: Ich wollte auch noch mit in den Bereich, in dem Mann nicht fett rüberkommt ...
Na ja, oft kommt ja das dicke Ende erst am Schluss - im diesem Beitrag aber du .... *gg jezz' aber weeeeeeech hier... - ich mach mich mal dünn... ..Grüße
Biber
@Biber
Grüße
bastla
jezz' aber weeeeeeech hier...
Nur keine Eile - Du bist ja sicher ohnehin schneller (öfters sogar beim Batchen ) ...Grüße
bastla
Hallo lordofremixes,
um ein Bild in einem Kommentar zu posten musst Du zuerst einen neuen Beitrag anlegen, den Du dann aber nicht veröffentlichst/als Entwurf kennzeichnest. Er muss aber eine gewisse Mindestanzahl von Zeichen enthalten. Bei einem Beitrag besteht die Möglichkeit Bilder anzufügen (unter der Box, in der Du den Beitrag schreibst, ist ein entsprechender Button). Die URLs, die Du nach dem hochladen erhälst, kannst Du dann auch in einem Kommentar benutzen. Nimm PNG oder JPG als Bildformat.
Gruß
Friemler
um ein Bild in einem Kommentar zu posten musst Du zuerst einen neuen Beitrag anlegen, den Du dann aber nicht veröffentlichst/als Entwurf kennzeichnest. Er muss aber eine gewisse Mindestanzahl von Zeichen enthalten. Bei einem Beitrag besteht die Möglichkeit Bilder anzufügen (unter der Box, in der Du den Beitrag schreibst, ist ein entsprechender Button). Die URLs, die Du nach dem hochladen erhälst, kannst Du dann auch in einem Kommentar benutzen. Nimm PNG oder JPG als Bildformat.
Gruß
Friemler
Du hast irgendetwas mit dem Link falsch gemacht. Wenn ich ihn anklicke kommt eine Fehlermeldung, dass ich mich anmelden soll. Außerdem sollte garkein Link erscheinen sondern das Bild.
Übernehme den Link aus der Bilder-Uploadbox genau so, wie er dort steht. Und ändere einfach Dein vorheriges Posting statt ein neues zu erstellen.
Übernehme den Link aus der Bilder-Uploadbox genau so, wie er dort steht. Und ändere einfach Dein vorheriges Posting statt ein neues zu erstellen.
Tut mir leid, aber ich kann Deinem Gedankengang nicht folgen. Was soll der FTP-Server damit zu tun haben, dass der Event Consumer das Erstellen einer neuen Datei nicht bemerkt?
Teste das ganze doch nochmal, wenn in
Da das hier mittlerweile das 101 Posting ist und in Anbetracht der Uhrzeit werde ich jetzt auch Schluss machen. Evtl. kriege ich ja noch das Ergebnis des eben genannten Tests mit, aber ich lasse mich erst morgen wieder hier blicken.
N8
Friemler
Teste das ganze doch nochmal, wenn in
C:\cnc programme dnc\m1
keine oder nur 5 Dateien vorhanden sind.Da das hier mittlerweile das 101 Posting ist und in Anbetracht der Uhrzeit werde ich jetzt auch Schluss machen. Evtl. kriege ich ja noch das Ergebnis des eben genannten Tests mit, aber ich lasse mich erst morgen wieder hier blicken.
N8
Friemler
Hallo lordofremixes,
Dann bleibt Dir wohl nichts anderes übrig als einen geplanten Task einzurichten, der folgendes VBScript startet. Das Script prüft die Archivbits der im überwachten Verzeichis enthaltenen Dateien. Dateien mit gesetztem Archivbit werden korrigiert und danach das Archivbit gelöscht.
Als auszuführenden Befehl musst Du
eintragen.
Wie man im Taskplaner einen Task einrichtet, der z.B. alle 2 Minuten ausgeführt wird, finde bitte selbst heraus. Du bist im 3. Ausbildungsjahr, nicht wahr? Stichwort ist "Mehrfache Zeitpläne anzeigen" auf der Registerkarte "Zeitplan" des Taskplaners.
Falls z.Z. nur korrekte DNC-Dateien im Verzeichnis liegen, wäre es noch geschickt, vor der Einrichtung des Tasks mit
Gruß
Friemler
Dann bleibt Dir wohl nichts anderes übrig als einen geplanten Task einzurichten, der folgendes VBScript startet. Das Script prüft die Archivbits der im überwachten Verzeichis enthaltenen Dateien. Dateien mit gesetztem Archivbit werden korrigiert und danach das Archivbit gelöscht.
Als auszuführenden Befehl musst Du
cscript /nologo "PfadUndNameDesFolgendenScripts.vbs"
Wie man im Taskplaner einen Task einrichtet, der z.B. alle 2 Minuten ausgeführt wird, finde bitte selbst heraus. Du bist im 3. Ausbildungsjahr, nicht wahr? Stichwort ist "Mehrfache Zeitpläne anzeigen" auf der Registerkarte "Zeitplan" des Taskplaners.
Falls z.Z. nur korrekte DNC-Dateien im Verzeichnis liegen, wäre es noch geschickt, vor der Einrichtung des Tasks mit
ATTRIB
die Archivbits der Dateien im Verzeichnis zu löschen. Sonst werden beim ersten Start des geplanten Tasks erstmal alle Dateien geöffnet und geändert. Könnte etwas dauern.'Zu überwachendes Verzeichnis
strMonitoredPath = "C:\CNC Programme DNC\M1"
'Konstanten definieren
Const ForReading = 1
Const ForWriting = 2
'Dateisystem-Objekt erzeugen
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Alle Dateien im Verzeichnis betrachten
For Each objFile In objFSO.GetFolder(strMonitoredPath).Files
'Ist es eine DNC-Datei?
If LCase(objFSO.GetExtensionName(objFile.Name)) = "dnc" Then
'Ist das Archivbit gesetzt?
If objFile.Attributes And &H20 Then
'Dateiinhalt komplett in einen String einlesen
Set objInFile = objFile.OpenAsTextStream(ForReading)
strContent = objInFile.ReadAll
objInFile.Close
'Den String anhand des Zeilenumbruchs in ein Array zerlegen,
'dessen Elemente die einzelnen Zeilen enthalten.
arrContent = Split(strContent, vbCrLf)
'Objekt für Reguläre Ausdrücke erzeugen
Set objRegExp = New RegExp
'Nur den ersten Treffer zurückliefern
objRegExp.Global = False
'Suchmuster für die Maschinen-Nummer in Zeile 1 der Eingabedatei
objRegExp.Pattern = "\(([0-9]*)\)"
'Die Maschinen-Nummer extrahieren
strNewMachineNo = objRegExp.Execute(arrContent(0))(0).SubMatches(0)
'Suchmuster für den Aufbau der kompletten Zeile 3
objRegExp.Pattern = "(N)([0-9]*)( .*)"
'Maschinen-Nummer austauschen
arrContent(2) = objRegExp.Replace(arrContent(2), "$1" & strNewMachineNo & "$3")
'Aus dem Array wieder einen String machen, die einzelnen
'Arrayelemente durch Zeilenumbrüche voneinander trennen
'und den String in die ursprüngliche Datei schreiben.
'Der alte Inhalt wird dabei überschrieben.
Set objOutFile = objFile.OpenAsTextStream(ForWriting)
objOutFile.Write Join(arrContent, vbCrLf)
objOutFile.Close
'Archivbit löschen
objFile.Attributes = objFileAttributes And &hFFDF
End If
End If
Next
Gruß
Friemler
Aloha Friemler,
was meinst du bei 9800 Dateien, wie lange wird das ackern? Ein Durchgang alleine wird ja schon länger benötigen als die Zeitspanne bis zum nächsten Task *gg*
Eventuell sollte man einen Counter / Limiter einsetzen, der nur bis Anzahl X arbeitet, dann schließt und beim nächsten Aufruf werden eben auch wieder nur Anzahl X abgearbeitet (zumindest würde ich das im batch jetzt so optimieren ...)
Eigentlich gibt es also zwei Anwendungsfälle:
Letzteres geht reibungslos, ersteres braucht viiiieeeel Kaffee
greetz André
was meinst du bei 9800 Dateien, wie lange wird das ackern? Ein Durchgang alleine wird ja schon länger benötigen als die Zeitspanne bis zum nächsten Task *gg*
Eventuell sollte man einen Counter / Limiter einsetzen, der nur bis Anzahl X arbeitet, dann schließt und beim nächsten Aufruf werden eben auch wieder nur Anzahl X abgearbeitet (zumindest würde ich das im batch jetzt so optimieren ...)
Eigentlich gibt es also zwei Anwendungsfälle:
- 9800 vorhandene Dateien ändern
- immer wieder neue Dateien ändern
Letzteres geht reibungslos, ersteres braucht viiiieeeel Kaffee
greetz André
Moin André,
von den 9800 Dateien wird ja nur das Archivbit abgefragt, nur bei gesetztem Archivbit wird geändert und dann das Archivbit gelöscht. Ich kann es jetzt nicht testen, sollte aber ausreichend schnell ablaufen.
Ein Limit einführen geht auch nicht. Die Dateien werden von der [EDIT] Zu schnell gelesen. [/EDIT]
Gruß
Friemler
von den 9800 Dateien wird ja nur das Archivbit abgefragt, nur bei gesetztem Archivbit wird geändert und dann das Archivbit gelöscht. Ich kann es jetzt nicht testen, sollte aber ausreichend schnell ablaufen.
FILES
-Methode ja nicht sortiert sondern in der Reihenfolge geliefert, in der die Einträge im Verzeichnis abgelegt sind. Neue Dateien landen also meistens am Ende der Liste. Dann würden sie nicht verarbeitet.Gruß
Friemler
Aloha Friemler,
bei 9800 Dateien mit gesetztem Archivbit sind 9800 Dateien zur Verarbeitung vorhanden
Der TE meinte ja bereits, dass die Batch beim Loslassen auf 9800 Dateien (die erstmal alle ein A-bit haben und darum auch erst einmal völlig egal ist, ob man das filtert oder nicht) hängen bleibt (ich vermute eher: noch mehrere Stunden ackern will)
Denn mit
greetz André
bei 9800 Dateien mit gesetztem Archivbit sind 9800 Dateien zur Verarbeitung vorhanden
Der TE meinte ja bereits, dass die Batch beim Loslassen auf 9800 Dateien (die erstmal alle ein A-bit haben und darum auch erst einmal völlig egal ist, ob man das filtert oder nicht) hängen bleibt (ich vermute eher: noch mehrere Stunden ackern will)
Denn mit
dir /b /AA
und attrib -A %1
habe ich ja auch bereits rumgespielt greetz André
Moin lordofremixes,
zunächst mal: Die ganze Ackererei von gestern war umsonst . Die Lösung mit dem Event Consumer ist für Dich nicht brauchbar. Gehe nach der schon geposteten Anleitung vor und entferne die Hinterlassenschaften dieses Versuchs.
Dann speicherst Du meinen neuen Code in einem beliebigen Pfad als VBS-Datei.
Dann öffnest Du eine Konsole und löschst mit
Dann legst Du den geplanten Task an und gibst dabei wie beschrieben die Datei mit dem neuen Code an.
Ich könnte hier jetzt noch was zu "Hellen Momenten" sagen, verkneife ich mir aber...
Gruß
Friemler
zunächst mal: Die ganze Ackererei von gestern war umsonst . Die Lösung mit dem Event Consumer ist für Dich nicht brauchbar. Gehe nach der schon geposteten Anleitung vor und entferne die Hinterlassenschaften dieses Versuchs.
Dann speicherst Du meinen neuen Code in einem beliebigen Pfad als VBS-Datei.
Dann öffnest Du eine Konsole und löschst mit
ATTRIB
die Archivbits der Dateien im M1
-Verzeichnis. Wie das geht, verrät Dir die Hilfe von ATTRIB
, erreichbar über die Eingabe von ATTRIB /?
in der Konsole.Dann legst Du den geplanten Task an und gibst dabei wie beschrieben die Datei mit dem neuen Code an.
Ich könnte hier jetzt noch was zu "Hellen Momenten" sagen, verkneife ich mir aber...
Gruß
Friemler
Spende ihn der örtlichen Obdachloseneinrichtung .
Ciao
Friemler
Hallo lordofremixes,
an meinem Script jedenfalls nicht. Wenn der Arbeiter seine geänderte Datei abschickt, landet sie erstmal auf der Platte des Servers. Durch das neu schreiben wird das Archivbit gesetzt. Beim nächsten Lauf des geplanten Tasks wird die Nummer aus Zeile 1 in Zeile 3 eingesetzt (ist in dem Fall sowieso gleich), der Rest der Datei wird unverändert übernommen (die geänderte Zeile sollte ja schon enthalten sein) und danach das Archivbit gelöscht.
Evtl. hat der FTP-Server ein Problem damit, eine existierende Datei zu überschreiben oder die geänderte Datei kommt aus irgendeinem Grund garnicht beim Server an. Du solltest mal in dieser Richtung forschen (Änderungsdatum der Datei; übernimmt die DNC-Box die geänderte Zeile, wenn das Programm unter dem gleichen Namen gespeichert werden soll?).
Du kannst ja probehalber den geplanten Task deaktivieren. Das von Dir beschriebene Fehlverhalten sollte dann immer noch auftreten.
Gruß
Friemler
an meinem Script jedenfalls nicht. Wenn der Arbeiter seine geänderte Datei abschickt, landet sie erstmal auf der Platte des Servers. Durch das neu schreiben wird das Archivbit gesetzt. Beim nächsten Lauf des geplanten Tasks wird die Nummer aus Zeile 1 in Zeile 3 eingesetzt (ist in dem Fall sowieso gleich), der Rest der Datei wird unverändert übernommen (die geänderte Zeile sollte ja schon enthalten sein) und danach das Archivbit gelöscht.
Evtl. hat der FTP-Server ein Problem damit, eine existierende Datei zu überschreiben oder die geänderte Datei kommt aus irgendeinem Grund garnicht beim Server an. Du solltest mal in dieser Richtung forschen (Änderungsdatum der Datei; übernimmt die DNC-Box die geänderte Zeile, wenn das Programm unter dem gleichen Namen gespeichert werden soll?).
Du kannst ja probehalber den geplanten Task deaktivieren. Das von Dir beschriebene Fehlverhalten sollte dann immer noch auftreten.
Gruß
Friemler
Hallo lordofremixes,
dafür gibt es mehrere Tools im Netz. Das nach meinem Geschmack beste ist HStart. Weitere Möglichkeiten: RunH, HideThis.
Du könntest aber auch versuchen, statt
[EDIT]
Mit
[/EDIT]
Gruß
Friemler
Du könntest aber auch versuchen, statt
cscript
das Programm wscript
in den geplanten Task zum Ausführen des VBScripts einzutragen.[EDIT]
Mit
wscript.exe
statt cscript.exe
funktioniert das ganz sicher.[/EDIT]
Gruß
Friemler
Moin,
[OT]
Ich will mich ja nicht unnötig einmischen....
ganz oben schrub ich was von Nebenwirkungen...
Dein Chef ist Glücklich, du hast das Lob abbekommen und gemacht hat es der Friemler - Schön und Gut aber du kommst mit den mikriksten Banalfragen und was passiert - wenn der Friemler nicht mehr kann oder will?
Nehm dir "deinen" Rechner - baue "deine" Umgebung nach - bilde dir selbst ein Urteil, was wie und warum weshalb funktioniert oder eben nicht.
Das ist doch der Sinn des Forums - Leuten zu zeigen wie es geht, aber doch nicht jeden Schritt vorkaspern...
Und komm mir bloss nicht mit Keine Zeit....
[/OT]
Ich würde ja banal hergehen und den Task unter einem "User" laufen lassen, der nur dafür gedacht ist und der keine Interaktion mit dem angemeldeten Userdesktop hat. Aber ich habs ja auch gelernt.....
Bin draussen
[OT]
Ich will mich ja nicht unnötig einmischen....
Zitat von @lordofremixes:
Hallo Friemler,
ich werde sobald ich wieder an diesen PC kann weiter testen und berichten.
Eine andere Frage: gibt es die Möglichkeit, den Aufruf der Dosbox minimiert darzustellen?
Weil jede Minute, wenn die Batch startet, sind die Arbeiter total verwirrt weil diese DOS Box im Vordergrund aufgeht
Hast du da ne Idee?
Hallo Friemler,
ich werde sobald ich wieder an diesen PC kann weiter testen und berichten.
Eine andere Frage: gibt es die Möglichkeit, den Aufruf der Dosbox minimiert darzustellen?
Weil jede Minute, wenn die Batch startet, sind die Arbeiter total verwirrt weil diese DOS Box im Vordergrund aufgeht
Hast du da ne Idee?
ganz oben schrub ich was von Nebenwirkungen...
Dein Chef ist Glücklich, du hast das Lob abbekommen und gemacht hat es der Friemler - Schön und Gut aber du kommst mit den mikriksten Banalfragen und was passiert - wenn der Friemler nicht mehr kann oder will?
Nehm dir "deinen" Rechner - baue "deine" Umgebung nach - bilde dir selbst ein Urteil, was wie und warum weshalb funktioniert oder eben nicht.
Das ist doch der Sinn des Forums - Leuten zu zeigen wie es geht, aber doch nicht jeden Schritt vorkaspern...
Und komm mir bloss nicht mit Keine Zeit....
[/OT]
Ich würde ja banal hergehen und den Task unter einem "User" laufen lassen, der nur dafür gedacht ist und der keine Interaktion mit dem angemeldeten Userdesktop hat. Aber ich habs ja auch gelernt.....
Bin draussen
Moin Timo,
noch banaler ist doch der Austausch von
In Bezug auf den TO muss ich Dir Recht geben.
@lordofremixes: Ich wünsche Dir wirklich viel Glück für die Abschlussprüfung.
Gruß
Friemler
Zitat von @60730:
Ich würde ja banal hergehen und den Task unter einem "User" laufen lassen, der nur dafür gedacht ist und der
keine Interaktion mit dem angemeldeten Userdesktop hat. Aber ich habs ja auch gelernt.....
Ich würde ja banal hergehen und den Task unter einem "User" laufen lassen, der nur dafür gedacht ist und der
keine Interaktion mit dem angemeldeten Userdesktop hat. Aber ich habs ja auch gelernt.....
noch banaler ist doch der Austausch von
cscript.exe
gegen wscript.exe
. Wie war das mit den blinden (ungelernten) Hühnern? In Bezug auf den TO muss ich Dir Recht geben.
@lordofremixes: Ich wünsche Dir wirklich viel Glück für die Abschlussprüfung.
Gruß
Friemler
Hallo lordofremixes,
aus der Verwendung des
auch direkt in den Taskplaner eintragen.
Gruß
Friemler
aus der Verwendung des
START
-Befehls schließe ich, dass Du den Befehl cscript /nologo "C:\CNC Programme DNC\Script\DNC.vbs"
in einem Batchfile stehen hast. Das wäre aber garnicht nötig, Du könntestwscript "C:\CNC Programme DNC\Script\DNC.vbs"
Gruß
Friemler
Servus und [OT]
.. entspann dich mal und nimm dir eine Tüte Kaffee - das hab ich nicht gesagt, sondern geschrieben und das war etwas überspitzt.
Du wärst nicht der erste, der keine große Ahnung hat, was man Ihm da gebaut hat und das kann ich durchaus beurteilen.
Und dann schauste dir mal den Kommenar vom Dani an..
Und wir hatten hier schon wirklich "richtige" Probleme gelöst.
[/OT]
Gruß
.. entspann dich mal und nimm dir eine Tüte Kaffee - das hab ich nicht gesagt, sondern geschrieben und das war etwas überspitzt.
Du wärst nicht der erste, der keine große Ahnung hat, was man Ihm da gebaut hat und das kann ich durchaus beurteilen.
Und dann schauste dir mal den Kommenar vom Dani an..
gratuliere... 100 Kommentare innerhalb von ca. 12 Stunden. Das ist neuer Rekord!
Und wir hatten hier schon wirklich "richtige" Probleme gelöst.
[/OT]
Gruß
Hallo lordofremixes,
ich poste hier mal eine erweiterte Version meines Scriptes, die Einträge in ein Logfile schreibt, wann es gestartet und beendet wurde und wann welche Datei wie geändert wurde. Evtl. hilft dir das bei der Fehlersuche. Pfad und Name des Logfiles bitte in Zeile 5 eintragen.
Deine 2. Frage deutet darauf hin, dass das Zeitfenster von 1 Minute für den Lauf des Scripts zu kurz sein könnte, du hast ja ca. 10000 Dateien im Verzeichnis. Wahrscheinlich wird während dem Lauf einer Instanz des Scripts über den Taskplaner eine zweite Instanz gestartet, die ebenfalls die zu diesem Zeitpunkt noch nicht geänderte DNC-Datei ändert und neu schreibt (Race Condition). Verlängere das Intervall im Taskplaner mal um 1 Minute.
Viel Erfolg
Friemler
ich poste hier mal eine erweiterte Version meines Scriptes, die Einträge in ein Logfile schreibt, wann es gestartet und beendet wurde und wann welche Datei wie geändert wurde. Evtl. hilft dir das bei der Fehlersuche. Pfad und Name des Logfiles bitte in Zeile 5 eintragen.
'Zu überwachendes Verzeichnis
strMonitoredPath = "C:\CNC Programme DNC\M1"
'Protokolldatei
strLogFile = "C:\CNC Programme DNC\Logfile.txt"
'Konstanten definieren
Const ForReading = 1
Const ForWriting = 2
'Dateisystem-Objekt erzeugen
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Protokolldatei im APPEND-Modus öffnen
Set objLogFile = objFSO.OpenTextFile(strLogFile, 8, True)
'Protokollzeile schreiben
objLogFile.WriteLine "------------------------------------------------------------------------"
objLogFile.WriteLine Now & " :: Automatische Reparatur von DNC-Dateien gestartet"
'Protokolldatei schließen
objLogFile.Close
'Alle Dateien im Verzeichnis betrachten
For Each objFile In objFSO.GetFolder(strMonitoredPath).Files
'Ist es eine DNC-Datei?
If LCase(objFSO.GetExtensionName(objFile.Name)) = "dnc" Then
'Ist das Archivbit gesetzt?
If objFile.Attributes And &H20 Then
'Dateiinhalt komplett in einen String einlesen
Set objInFile = objFile.OpenAsTextStream(ForReading)
strContent = objInFile.ReadAll
objInFile.Close
'Den String anhand des Zeilenumbruchs in ein Array zerlegen,
'dessen Elemente die einzelnen Zeilen enthalten.
arrContent = Split(strContent, vbCrLf)
'Objekt für Reguläre Ausdrücke erzeugen
Set objRegExp = New RegExp
'Nur den ersten Treffer zurückliefern
objRegExp.Global = False
'Suchmuster für die Maschinen-Nummer in Zeile 1 der Eingabedatei
objRegExp.Pattern = "\(([0-9]*)\)"
'Die Maschinen-Nummer extrahieren
strNewMachineNo = objRegExp.Execute(arrContent(0))(0).SubMatches(0)
'Suchmuster für den Aufbau der kompletten Zeile 3
objRegExp.Pattern = "(N)([0-9]*)( .*)"
'Alten Zeileninhalt merken
strOldLine3 = arrContent(2)
'Maschinen-Nummer austauschen
arrContent(2) = objRegExp.Replace(arrContent(2), "$1" & strNewMachineNo & "$3")
'Aus dem Array wieder einen String machen, die einzelnen
'Arrayelemente durch Zeilenumbrüche voneinander trennen
'und den String in die ursprüngliche Datei schreiben.
'Der alte Inhalt wird dabei überschrieben.
Set objOutFile = objFile.OpenAsTextStream(ForWriting)
objOutFile.Write Join(arrContent, vbCrLf)
objOutFile.Close
'Archivbit löschen
objFile.Attributes = objFileAttributes And &hFFDF
'Protokolldatei im APPEND-Modus öffnen
Set objLogFile = objFSO.OpenTextFile(strLogFile, 8, True)
'Protokollzeile schreiben
objLogFile.WriteLine Now & " :: Datei " & objFile.Path & " geändert: In Zeile 3 '" & strOldLine3 & "' die Satznummer gegen " & strNewMachineNo & " getauscht"
'Protokolldatei schließen
objLogFile.Close
End If
End If
Next
'Protokolldatei im APPEND-Modus öffnen
Set objLogFile = objFSO.OpenTextFile(strLogFile, 8, True)
'Protokollzeile schreiben
objLogFile.WriteLine Now & " :: Automatische Reparatur von DNC-Dateien beendet"
objLogFile.WriteLine "------------------------------------------------------------------------"
'Protokolldatei schließen
objLogFile.Close
Deine 2. Frage deutet darauf hin, dass das Zeitfenster von 1 Minute für den Lauf des Scripts zu kurz sein könnte, du hast ja ca. 10000 Dateien im Verzeichnis. Wahrscheinlich wird während dem Lauf einer Instanz des Scripts über den Taskplaner eine zweite Instanz gestartet, die ebenfalls die zu diesem Zeitpunkt noch nicht geänderte DNC-Datei ändert und neu schreibt (Race Condition). Verlängere das Intervall im Taskplaner mal um 1 Minute.
Viel Erfolg
Friemler
Hallo lordofremixes,
warum das neue Script nicht funktioniert kann ich nicht nachvollziehen, bei mir läuft es. Hast du dir den Quellcode über die Kopieren-Funktion des Forums (der Link "Quelltext" rechts oberhalb der Codebox) besorgt? Hast du die Pfade in den Zeilen 2 und 5 angepasst? Wurde eine Logdatei erstellt? Wenn ja, was stand drin?
Zur Problematik der Dateien ohne Artikelbeschreibung: Tausche Zeile 37 im alten Script aus diesem Posting aus.
Alter Inhalt:
Neuer Inhalt:
Das ist ein regulärer Ausdruck, der den Aufbau von Zeile 3 beschreibt. Der alte Ausdruck enthält in der letzten Klammer ein Leerzeichen. Da dieses Leerzeichen bei Dateien ohne Artikelbeschreibung nicht vorkommt (nach der Satznummer ist die Zeile zu Ende), funktioniert dieser Ausdruck nicht. Die Zeichen
Du solltest versuchen, die neue Scriptversion ans Laufen zu bekommen. Auch hier muss natürlich obige Zeile geändert werden, dort handelt es sich um Zeile 48. Im Logfile kannst du dann auch sehen, wie lange das Script braucht um alle Dateien abzuarbeiten und dann das Zeitintervall im Taskplaner optimal einstellen. Vergiss nicht zu berücksichtigen, dass die Laufzeit zunimmt, wenn Dateien mit gesetztem Archivbit geändert werden müssen. Teste das Script doch zuerst mal durch einen Direktaufruf von der Konsole aus. Dann siehst Du auch evtl. erscheinende Fehlermeldungen.
Gruß
Friemler
warum das neue Script nicht funktioniert kann ich nicht nachvollziehen, bei mir läuft es. Hast du dir den Quellcode über die Kopieren-Funktion des Forums (der Link "Quelltext" rechts oberhalb der Codebox) besorgt? Hast du die Pfade in den Zeilen 2 und 5 angepasst? Wurde eine Logdatei erstellt? Wenn ja, was stand drin?
Zur Problematik der Dateien ohne Artikelbeschreibung: Tausche Zeile 37 im alten Script aus diesem Posting aus.
Alter Inhalt:
objRegExp.Pattern = "(N)([0-9]*)( .*)"
Neuer Inhalt:
objRegExp.Pattern = "(N)([0-9]*)(.*)"
Das ist ein regulärer Ausdruck, der den Aufbau von Zeile 3 beschreibt. Der alte Ausdruck enthält in der letzten Klammer ein Leerzeichen. Da dieses Leerzeichen bei Dateien ohne Artikelbeschreibung nicht vorkommt (nach der Satznummer ist die Zeile zu Ende), funktioniert dieser Ausdruck nicht. Die Zeichen
.*
im neuen Ausdruck bedeuten: Beliebige Zeichen (der Punkt) beliebig oft (der Stern). "Beliebig oft" schließt das 0-malige Auftreten (also garnicht) ein.Du solltest versuchen, die neue Scriptversion ans Laufen zu bekommen. Auch hier muss natürlich obige Zeile geändert werden, dort handelt es sich um Zeile 48. Im Logfile kannst du dann auch sehen, wie lange das Script braucht um alle Dateien abzuarbeiten und dann das Zeitintervall im Taskplaner optimal einstellen. Vergiss nicht zu berücksichtigen, dass die Laufzeit zunimmt, wenn Dateien mit gesetztem Archivbit geändert werden müssen. Teste das Script doch zuerst mal durch einen Direktaufruf von der Konsole aus. Dann siehst Du auch evtl. erscheinende Fehlermeldungen.
Gruß
Friemler
Hallo lordofremixes,
Optimismus ist gut, Kontrolle ist besser. Du hattest erwähnt, dass du sehr viele DNC-Dateien mit gesetztem Archivbit gefunden hättest. Sollte ja eigentlich nicht vorkommen. Ich würde das lieber noch im Auge behalten. Das Log kann dich dabei unterstützen.
Gruß
Friemler
Zitat von @lordofremixes:
Glaube nicht. dass jetzt noch irgendwas falsch sein kann bzw. nicht funktioert.
Glaube nicht. dass jetzt noch irgendwas falsch sein kann bzw. nicht funktioert.
Optimismus ist gut, Kontrolle ist besser. Du hattest erwähnt, dass du sehr viele DNC-Dateien mit gesetztem Archivbit gefunden hättest. Sollte ja eigentlich nicht vorkommen. Ich würde das lieber noch im Auge behalten. Das Log kann dich dabei unterstützen.
Gruß
Friemler