lordofremixes
Goto Top

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!
Kommentar vom Moderator Biber am Aug 31, 2011 um 09: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-Key: 172339

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

Printed on: April 19, 2024 at 10:04 o'clock

Member: Skyemugen
Skyemugen Aug 31, 2011 at 09:13:43 (UTC)
Goto Top
Aloha,

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)
Member: lordofremixes
lordofremixes Aug 31, 2011 at 09:24:19 (UTC)
Goto Top
Stimmt, kein Gruß, sorry !
HALLO ERSTMAL ZUSAMMEN! danke auch für die schnelle Antwort !

Habe nach VBS inliner gegoogelt, aber wirklich schlau bin ich daraus nicht geworden.
Ist meine Problemstellung auch ohne VB Kenntnisse möglich zu lösen?

Gibt es vielleicht jemand der mir eine fertige Lösung präsentieren kann?
Sorry für die Unverschämtheit, aber ich bin wirklich unter Zeitdruck (Chef kommt morgen aus dem Urlaub und will das gelöst sehen)

Vielen Dank im Voraus!!
Mitglied: 60730
60730 Aug 31, 2011 at 09:24:32 (UTC)
Goto Top
Servus,

Zitat von @lordofremixes:
Mein Chef reißt mir den Kopf ab,
  • 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ß
Member: lordofremixes
lordofremixes Aug 31, 2011 at 09:29:36 (UTC)
Goto Top
Hallo,
sorry erstmal für alles(wenn ich grad soviel Blödsinn schreibe). Aber wirklich grad Stress pur.

Habe noch nie eine batch datei geschrieben (außer rename *.* *.dnc) um die CNC Programme in DNC Dateien umzubennen.

Nach zed habe ich schon geschaut, aber da kann ich doch nicht automatisiert ändern?

Und ich weiß ja nicht wie ich die Zeile rausfiltern soll, die ich ersetzt haben möchte durch den Dateiname. Sprich: Ich hab keina Ahnung.

Gruß
Mitglied: 99045
99045 Aug 31, 2011 at 09:34:47 (UTC)
Goto Top
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ß
Mitglied: 60730
60730 Aug 31, 2011 at 09:34:50 (UTC)
Goto Top
Zitat von @lordofremixes:
Stimmt, kein Gruß, sorry !
HALLO ERSTMAL ZUSAMMEN! danke auch für die schnelle Antwort !
  • ok ok...
Nunja - sollen wir das wirklich machen?
  • 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ß
Member: lordofremixes
lordofremixes Aug 31, 2011 at 09:50:57 (UTC)
Goto Top
Hallo,

ich lese seit 7.45 verschiedene Threads durch.

In allen DNC Dateien gibt es außer in den ersten beiden Zeilen sonst keine $ oder % Zeichen mehr.

Habe diesen Ansatz probiert:

@echo off & setlocal

set "Textdatei=D:\Meine.TXT"

set "tempdatei=%temp%\tmp"

type nul>"%tempdatei%"


move /y "%tempdatei%" "%Textdatei%"

goto :eof

:Zeile

echo %Zeile: ABC=ABC%>>%tempdatei%

Aber das ist doch viel zu kompliziert oder nicht? Es muss doch auch mit Batch gehen.
Ich würde gern wissen (und das steht in keinem anderen Thread), wie ich die dritte Zeile (steht auch IMMER in der dritten Zeile) die N3859965 rausfiltriere , und durch N+Dateiname ersetzen kann.
Von der Logik sieht das doch so aus . Denke ich da richtig ?

1. öffne Dateiname.dnc
2. Springe zur dritten Zeile
3. entferne nur N3859961
4. ersetze durch NDateiname
5. speichere als Dateiname.dnc

Mit dem Lieferanten habe ich gestern den ganzen Tag telefoniert, er kennt keine Lösung, und an der Maschine ist es einfach nicht möglich die Datei manuell zu ändern und abzuspeichern.

Danke für die ganzen Antworten!

Gruß
Mitglied: 60730
60730 Aug 31, 2011 at 09:55:56 (UTC)
Goto Top
  • 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.

Zitat von @lordofremixes:
4. ersetze durch NDateiname

Ich dachte da soll
N3859965 (SIEBKORB)
rein..... Und die Datei heisst nicht xyz (SIEBKORB)
Member: lordofremixes
lordofremixes Aug 31, 2011 at 09:57:39 (UTC)
Goto Top

Ich würde außerdem grob Tippen, das das ein "echter" oder mal von Bastla inspirietes Schnippselchen ist.

Wie meinst du das ^^
Member: Skyemugen
Skyemugen Aug 31, 2011 at 09:59:14 (UTC)
Goto Top
Aloha,

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

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*
Member: Friemler
Friemler Aug 31, 2011 at 10:12:17 (UTC)
Goto Top
Hi @all,

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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 10:15:40 (UTC)
Goto Top
HALLO,

sag mal spinnt ihr???
das ist DIE LÖSUNG. Wie hast du das so schnell hinbekommen?????
Weißt du wie ich mich gerade freu?? Echt hammer !! Aufgabenstellung genau erkannt und perfekt, durchgeführt !! Geil!!! Danke, Danke, und nochmal Danke!!

Eine Frage noch, da diese Batch Datei immer laufen sollte, sprich: Arbeiter an der Maschine schickt das Programm weg, es wird falsch (also mit dem Fehler in der dritten Zeile) an den PC geschickt.
Kann man das irgendwie einschränken, dass er nur die Dateien macht die neu reingekommen sind?

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.

Gruß und nochmals vielen Dank!
Member: lordofremixes
lordofremixes Aug 31, 2011 at 10:41:35 (UTC)
Goto Top
Hallo,

danke für deine Hilfe.
Wenn ich dieses Programm ausführe, sind danach alle dnc Dateien leer. Vielleicht habe ich was falsch gemacht. Das Output Verzeichnis habe ich natürlich geändert ?
Member: Friemler
Friemler Aug 31, 2011 at 10:47:26 (UTC)
Goto Top
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
Member: Skyemugen
Skyemugen Aug 31, 2011 at 10:49:10 (UTC)
Goto Top
nevermind, ich blick schon gar nicht mehr, wer worauf wie antwortet (gleich gibt's Mittag)
Member: Skyemugen
Skyemugen Aug 31, 2011 at 10:56:13 (UTC)
Goto Top
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.

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

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é
Member: lordofremixes
lordofremixes Aug 31, 2011 at 10:56:43 (UTC)
Goto Top
Nein, vielleicht hab ich mich da ein wenig umständlich ausgedrückt.
Das Input und Outputverzeichnis sind das selbe. Es ging darum, wenn er ein bestehendes Maschinenprogramm läd und daran was ändert (zum Beispiel nur die Länge), muss er dieses Programm ja unter einer anderen Zeichnungsnummer abspeichern. Das klappt so weit auch, die neue Zeichnungsnummer wird unter dem neuen Dateiname(=neue Zeichnungsnummer, da z.B. Länge geändert)abgespeichert. Nur die dritte Zeile, wird dann trotzdem noch unter der untersprünglichen Zeichnungsnummer abgespeichert. Das kann man an der Maschine manuell nicht ändern und wenn ich das neue Programm dann nochmal einlsen möchte, meckert die Maschine , dass es so ein Programm schon gibt.
Member: lordofremixes
lordofremixes Aug 31, 2011 at 10:57:51 (UTC)
Goto Top
Ok ,das wäre dann wirklich Ultima!!

Wünsch dir en guten Appetit!!

Gruß
Member: Biber
Biber Aug 31, 2011 at 11:12:57 (UTC)
Goto Top
[OT]
Moin LordofPürierstab,

willkommen im Forum.

Geht mich ja nix an, aber...
Zitat von @lordofremixes:
Ok ,das wäre dann wirklich Ultima!!
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]
Member: lordofremixes
lordofremixes Aug 31, 2011 at 11:14:16 (UTC)
Goto Top
Es ist leider nicht möglich, zwei verschiedene Verzeichnisse anzulegen, da das alte ftp Programm, das den Dateitransfer regelt, nur auf ein Verzeichnis zugreifen kann face-sad (habe grad noch mal geschaut).
Mitglied: 99045
99045 Aug 31, 2011 at 11:19:50 (UTC)
Goto Top
[OT]
Moin, Biber

sein nachsichtig, er hat doch nur das ratio unterschlagen. face-wink

Gruß
[/OT]
Member: lordofremixes
lordofremixes Aug 31, 2011 at 11:22:29 (UTC)
Goto Top
danke für den hinweis,
liegt glaub ich daran dass ich früher zu viel ultima online gezockt hab ;)
Mitglied: 99045
99045 Aug 31, 2011 at 11:24:27 (UTC)
Goto Top
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 .......
Member: Friemler
Friemler Aug 31, 2011 at 11:34:57 (UTC)
Goto Top
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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 11:47:10 (UTC)
Goto Top
Hallo Friemler,

die Lösung von Skyemugen hat bei mir aber ausgezeichnet funktioniert. Habe schon einige Dateien , die falsch waren, getestet, und alle sind richtig umgewandelt.
Wo liegt bei seinem Script der Fehler und was ist Pure-VB-Script?

Habe den WMI Permanent Event Consumer angeschaut, muss aber ehrlich gestehen, dass ich nicht weiß wie ich das für meinen Fall bezogen einstellen muss.

Du hast geschrieben dass man nur die Zeilen 13 - 15 anpassen muss. Zeile 13 ist unklar, ich vermute aber dass hier der Aufruf des Scripts rein kommt.(z.B. das Skyemugen Script, wenn es richtig ist)
Zeile 14 ist klar, das Verzeichnis in dem sich die dnc Dateien befinden.
Zeile 15 ist auch klar.

wie komme ich überhaupt in diese Zeilen rein?

13.
strEventDescription = "New Textfile Creation"
14.
strMonitorFileSpec = "E:\Test\*.TIFF"
15.
strPollingIntervall = "1"
Member: Skyemugen
Skyemugen Aug 31, 2011 at 11:57:02 (UTC)
Goto Top
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
for /f "delims=" %%s in ('dir /b /AA *.dnc') do call :Ablauf "%%s"
geändert und nach Zeile 13 (vor 14) dann
attrib -A %1
hinzugefügt werden müsste.

greetz André

P.S.:@Friemler
Dazu müsste Skyemugen (?) eine Pure-VBScript Version seiner Lösung erstellen
Nice joke one face-wink das würde ich wenn dann bastla oder dir überlassen *gg*
Member: Skyemugen
Skyemugen Aug 31, 2011 at 11:59:20 (UTC)
Goto Top
Aloha,

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é
Member: Friemler
Friemler Aug 31, 2011 at 12:04:36 (UTC)
Goto Top
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

Zitat von @lordofremixes:
wie komme ich überhaupt in diese Zeilen rein?

Gruß
Friemler
Member: lordofremixes
lordofremixes Aug 31, 2011 at 12:05:15 (UTC)
Goto Top
ahh, ok , verstanden..
habe schon versucht, Friemlier s Lösung mit deiner Batch anzupassen , aber geht ja nicht, zeile 13 muss ja die vbs Datei drin stehn . *lichtaufgeh*
Member: lordofremixes
lordofremixes Aug 31, 2011 at 12:09:22 (UTC)
Goto Top
Hallo Friemler,

ja sry zu spät habe es grad gelesen und verstanden. Aber trotzdem finde ich dein Thread für andere vbs Sachen sehr, sehr hilfreich..


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.

Ok, verstanden. Hatte ich schon vermutet, oder steht auch in deinem Thread sry..
(bin heut einfach zu zappelig, morgen kommt der chef und irgendwie muss das mit der Batch heut noch gelöst werden)

Danke an alle die sich damit beschäftigen !!

Gruß
Member: lordofremixes
lordofremixes Aug 31, 2011 at 12:12:30 (UTC)
Goto Top
> ----
> wie komme ich überhaupt in diese Zeilen rein?

hat sich erledigt, dachte ich muss cscript.exe anpassen, aber das ich ja ein script von dir .
Member: Skyemugen
Skyemugen Aug 31, 2011, updated at Oct 18, 2012 at 16:48:07 (UTC)
Goto Top
Zitat von @lordofremixes:
irgendwie muss das mit der Batch heut noch gelöst werden

Nur noch einmal als Wink mit dem Zaunpfahl, eventuell ist der Kommentar untergegangen bei der Threadstruktur face-wink
Attributsnutzung für nicht-alle-immer-wieder-durchkauen

Hatte auf Kaputtnicks Kommentar geantwortet, daher steht es jetzt mitten im Nirvana ^_^

greetz André
Member: lordofremixes
lordofremixes Aug 31, 2011 at 12:38:33 (UTC)
Goto Top
Hallo Skyemugen ,

ist das die Lösung, soll ich das einfügen? (mit der Attributsnutzung)?
Oder wie meinst du das grad?

gruß
Member: Friemler
Friemler Aug 31, 2011 at 12:55:46 (UTC)
Goto Top
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.

'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
Member: Skyemugen
Skyemugen Aug 31, 2011 at 12:58:32 (UTC)
Goto Top
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 face-wink

Oder du nimmst Friemlers Durcharbeitung ^_^

greetz André
Member: lordofremixes
lordofremixes Aug 31, 2011 at 13:11:34 (UTC)
Goto Top
Fallo Friemler,
wirklich super von dir. Das ist mir nochunklar?

1. Ich mach daraus jetzt eine Batch Datei? denke mal ja?
2. Diese muss im gleichen Verzeichnis wie die die dnc Dateien und das Script von skyemugen stehen?
3. in dem anderen Thread muss ich nur die Zeilen 13-15 bearbeiten, diese sind strEventDescription , strMonitorFileSpec und strPollingIntervall ?
welche sind das in diesem script?
Member: lordofremixes
lordofremixes Aug 31, 2011 at 13:17:46 (UTC)
Goto Top
Hallo Skyemugen,

leider gibt es im Taskplaner nur Täglich, wöchentlich, usw.. aber nicht minütlich.

Zu deinem Script:
Ich werde das Script von Friemler nehmen, aber wie kann ich am Ende die Zeile "Bitte eine Taste drücken" rauslöschen?
Weil sonst wenn das Script von Friemler dein Script aufruft, bleibt es ja stehen, weil man erst eine Taste drücken muss?

Gruß und Danke für alles
Member: Friemler
Friemler Aug 31, 2011 at 13:31:27 (UTC)
Goto Top
Hallo lordofremixes,

Du machst jetzt folgendes:

  1. Den Installer für den Permanent Event Consumer z.B. unter Installer.vbs speichern.
  2. 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"
  3. Das obige Eventhandler Script in diesem Fall unter dem Namen NewDNCFileCreationEventHandler.vbs speichern.
  4. Die beiden Scripte in ein Verzeichnis kopieren, am besten in ein neu erstelltes Unterverzeichnis von C:\Programme.
  5. 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.
  6. Mit CD in das Verzeichnis wechseln, in dem Du die Scripte abgelegt hast.
  7. 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
Member: Skyemugen
Skyemugen Aug 31, 2011 at 13:36:50 (UTC)
Goto Top
Aloha,

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)
Member: lordofremixes
lordofremixes Aug 31, 2011 at 13:49:24 (UTC)
Goto Top
das wäre ja auch eine super idee, wie kann man sie wieder zum Anfang springen lassen ?
Member: lordofremixes
lordofremixes Aug 31, 2011 at 13:51:38 (UTC)
Goto Top
und wie das dann mit der sleep funktion?
wo muss ich diese einbinden?
Member: Friemler
Friemler Aug 31, 2011 at 13:53:26 (UTC)
Goto Top
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
Member: Skyemugen
Skyemugen Aug 31, 2011 at 13:56:27 (UTC)
Goto Top
Aloha Friemler,

wo du gerade davon sprichst:

Wäre der Auslastungsunterschied zwischen der dauerlaufenden batch mit sleep.exe deutlich höher als ein dauerlaufendes VBSkript mit sleep-Befehl, der die Batch zyklisch ausführt?

greetz André
Member: lordofremixes
lordofremixes Aug 31, 2011 at 13:59:34 (UTC)
Goto Top
Hallo Friemler,
Die Lösung ist nahezu perfekt, im Gegensatz dazu hab ich kaum Prozessorleistung.
Wie verhält es sich bei dieser Lösung nach einem Neustart?
Der User , bei dem diese Lösung laufen soll meldet sich immer als Sammeluser an (ein CNC - Benutzername), ist aber kein Administrator. (welche Datei müsste ich also in den Autostart ordner?

Gruß
Member: Friemler
Friemler Aug 31, 2011 at 14:03:56 (UTC)
Goto Top
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
Member: Friemler
Friemler Aug 31, 2011 at 14:16:02 (UTC)
Goto Top
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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 14:19:00 (UTC)
Goto Top
Das wäre ja super. Hört sich alles sooo gut an , genau wie ichs bräuchte

Habe alles gemacht
Beim starten cscript /nologo Installer.vbs in cmd.exe kommt aber folgender Fehler :
C:\Script\Installer.vbs(112, 22) Kompilierungsfehler in Microsoft VBScript: Anwe
isung erwartet

??
Member: Biber
Biber Aug 31, 2011 at 14:23:32 (UTC)
Goto Top
[OT]
Hmm ja, ich reduziere mal die beiden Vor-Kommentare auf
[Kaputtnick] "Guten Tag, Herr Dr. Friemler!"
[Friemler] "Ihnen ebenfalls, Herr Professor von Caput Nique."

Was soll denn der Azubi von uns alten Zauseln denken?

[/OT]
Member: Friemler
Friemler Aug 31, 2011 at 14:37:51 (UTC)
Goto Top
[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 face-wink .

Zitat von @Biber:
Was soll denn der Azubi von uns alten Zauseln denken?

Das hat er ja schon hier kundgetan.

Gruß
Friemler

[/OT]
Member: Friemler
Friemler Aug 31, 2011 at 14:42:35 (UTC)
Goto Top
Hallo lordofremixes,

was steht denn in Deiner Zeile 112? Im Original steht
Set WshShell    = Nothing

Poste am besten Das ganze Installer Script.

Gruß
Friemler
Member: lordofremixes
lordofremixes Aug 31, 2011 at 14:42:51 (UTC)
Goto Top
ALSO FÜR DIE GANZE HILFE ERSTMAL VIELEN DANK!

@friemer : TOLLE SACHE, wenn du noch diesen kleiner fehler korrigieren könntest ? schick ich dir mein pc samt bildschirm ;)

Gruß
Member: lordofremixes
lordofremixes Aug 31, 2011 at 14:45:31 (UTC)
Goto Top
[Edit Biber]

inhalt dieses Kommentars gelöscht -- hier war eine fehlerhaft gecopy&pastete Friemler-Schnipsel-Version, die sich weiter unten auch nooch mehrmals findet.

Die fehlerhafte Formatierung führte zu etwas unleserlichen Folgekommentaren - siehe unten.


[/Edit Biber]
Member: lordofremixes
lordofremixes Aug 31, 2011 at 14:47:22 (UTC)
Goto Top
blöd, jetzt siehst du ja garnicht wol zeile 112 ist ? habe es mit phase geöffnet, alle zeilen nummern rausgelöscht und als installer.vbs gespeichert.
Member: Friemler
Friemler Aug 31, 2011 at 14:48:47 (UTC)
Goto Top
Hallo lordofremixes,

bitte, bitte, setze den geposteten Code in die ! Das geht auch nachträglich über "Beitrag bearbeiten". So macht das wirklich keinen Spaß Dir zu helfen. Und man sieht dann auch die Zeilennummern.

Warum ist hier plötzlich alles in Fettschrift?

Gruß
Friemler
Member: Friemler
Friemler Aug 31, 2011 at 14:52:38 (UTC)
Goto Top
Hallo lordofremixes,

um den Code zu kopieren benutze den Link "Quelltext" am oberen rechten Rand der Box mit dem Code. Dann brauchst Du auch keine Zeilennummern entfernen und es schleichen sich keine Fehler ein.

Gruß
Friemler
Member: Skyemugen
Skyemugen Aug 31, 2011 at 14:57:31 (UTC)
Goto Top
Zitat von @lordofremixes:
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)
Member: lordofremixes
lordofremixes Aug 31, 2011 at 15:03:43 (UTC)
Goto Top
 ' ===========================================  
 ' Run this script with administrative rights!  
 ' ===========================================  
 '/////////////////////////////// Configure script's job ///////////////////////////////  
 '******************** Customize according to your specific needs **********************  
 '------------------ Set event description and job related variables -------------------  
 strEventDescription  = "New Textfile Creation"  
 strMonitorFileSpec   = "C:\Script\DNC\*.dnc"  
 strPollingIntervall  = "1"  
 '---------------- Prepare Monitor Filespec for WMI Event Filter query -----------------  
 Set FSO              = CreateObject("Scripting.FileSystemObject")  
 strDrive             = FSO.GetDriveName(strMonitorFileSpec)
 strFileName          = FSO.GetFileName(strMonitorFileSpec)
 intPathBegin         = Len(strDrive) + 1
 intPathLen           = Len(strMonitorFileSpec) - Len(StrDrive) - Len(strFileName)
 strPath              = Replace(Mid(strMonitorFileSpec, intPathBegin, intPathLen), "\", "\\")  
 strExtension         = FSO.GetExtensionName(strMonitorFileSpec)
 Set FSO              = Nothing
 '----------------------------- Set WMI Event Filter query -----------------------------  
 strEventFilterQuery  = "SELECT * FROM __InstanceCreationEvent" _  
 & " WITHIN " & strPollingIntervall _  
 & " WHERE TargetInstance ISA 'CIM_DataFile'" _  
 & " AND TargetInstance.Drive='" & strDrive & "'" _  
 & " AND TargetInstance.Path='" & strPath & "'" _  
 & " AND TargetInstance.Extension='" & strExtension & "'"  
 '-------------- Set WMI Namespace where the monitored event will occure ---------------  
strEventNamespace    = "root\Cimv2"  
'----------- Set parameters which should be passed to Event Handler script ------------  
 strEventHandlerParam = """" _  
  & "%TargetInstance.Drive%" _  
  & "%TargetInstance.Path%" _  
  &   "%TargetInstance.FileName%" _  
   & "." _  
 & "%TargetInstance.Extension%" _  
 & """"  
'**************************************************************************************  
'//////////////////////////////// Set script variables ////////////////////////////////  
'- Set Event Handler path, quote it and prepare it and its working directory for WMI --  
Set FSO           = CreateObject("Scripting.FileSystemObject")  
strEventHandlerWD = Replace(FSO.GetParentFolderName(WScript.ScriptFullName), "\", "\\")  
strEventHandler   = Replace(strEventDescription, " ", "") & "EventHandler.vbs"  
strEventHandler   = """" & strEventHandlerWD & "\\" & strEventHandler & """"  
Set FSO           = Nothing
'----------------------- Test for existing Event Handler script -----------------------  
Set FSO = CreateObject("Scripting.FileSystemObject")  
If Not FSO.FileExists(Replace(Replace(strEventHandler, "\\", "\"), """", "")) Then  
  MsgBox "The Event Handler script " & vbCRLF _  
          & Replace(strEventHandler, "\\", "\") & vbCRLF _  
          & "does not exist. Please create it.", _  
         vbExclamation, _
         "Missing Event Handler script"  
End If
Set FSO = Nothing
'-------------------------- Build parameters for CScript.exe --------------------------  
strCScriptParam = strEventHandler & " " & strEventHandlerParam  
'---------------- Get path of Windows Directory and prepare it for WMI ----------------  
Set WshShell    = WScript.CreateObject("WScript.Shell")  
strWinDir       = Replace(WshShell.ExpandEnvironmentStrings("%SystemRoot%"), "\", "\\")  
Set WshShell    = Nothing
 '---------------------- Set path of CScript.exe prepared for WMI ----------------------  
 setCScriptPath  = strWinDir & "\\System32\\cscript.exe"  
 '////////////////////////// Install permanent Event Consumer //////////////////////////  
 '------- Get WMI Scripting API object (SWbemServices), Namespace: Subscription --------  
  strComputer                          = "."  
 Set objWMIService                    = GetObject("winmgmts:" _  
 & "{impersonationLevel=impersonate}!" _  
   & "\\" & strComputer & "\root\Subscription")  
  '------------------------------ Create the Event Filter -------------------------------  
  Set objFilterClass                   = objWMIService.Get("__EventFilter")  
  Set objFilter                        = objFilterClass.SpawnInstance_()
  objFilter.Name                       = strEventDescription & " Event Filter"  
  objFilter.EventNamespace             = strEventNamespace
  objFilter.QueryLanguage              = "WQL"  
  objFilter.Query                      = strEventFilterQuery
  Set EventFilterPath                  = objFilter.Put_()
  '----------------------- Create the Commandline Event Consumer ------------------------  
  Set objEventConsumerClass            = objWMIService.Get("CommandLineEventConsumer")  
  Set objEventConsumer                 = objEventConsumerClass.SpawnInstance_()
  objEventConsumer.Name                = strEventDescription & " Commandline Event Consumer"  
  objEventConsumer.CommandLineTemplate = setCScriptPath & " " & strCScriptParam  
  objEventConsumer.ExecutablePath      = setCScriptPath
  objEventConsumer.WorkingDirectory    = strEventHandlerWD
  objEventConsumer.ShowWindowCommand   = 0
  Set CommandlineEventConsumerPath     = objEventConsumer.Put_()
  '------------------ Bind Event Filter to Commandline Event Consumer -------------------  
    Set objBindingClass                  = objWMIService.Get("__FilterToConsumerBinding")  
  Set objBinding                       = objBindingClass.SpawnInstance_()
  objBinding.Filter                    = EventFilterPath
  objBinding.Consumer                  = CommandlineEventConsumerPath
  objBinding.Put_()

[Edit Biber] Codeformatierung nachgetragen 31.8.11 19:15h [/Edit]
Member: lordofremixes
lordofremixes Aug 31, 2011 at 15:08:00 (UTC)
Goto Top
strEventDescription = "New Textfile Creation"
steht natürlich "New DNCfile Creation"
Member: Friemler
Friemler Aug 31, 2011 at 15:20:22 (UTC)
Goto Top
Hallo lordofremixes,

bitte die benutzen.

Gruß
Friemler
Member: lordofremixes
lordofremixes Aug 31, 2011 at 15:22:01 (UTC)
Goto Top
MACH DIR BLOß KEINE ARBEIT MEHR !!
ES FUNKTIONIERT HERVORRAGEND !!!
DU GLAUBST GARNICHT WIE FROH ICH BIN!! MEINE FRESSE !!
Member: lordofremixes
lordofremixes Aug 31, 2011 at 15:22:31 (UTC)
Goto Top
AM LIEBSTEN WÜRD ICH DIE GANZE SEITE MIT DANKE POSTS VOLL SCHREIBEN
Member: Friemler
Friemler Aug 31, 2011 at 15:23:22 (UTC)
Goto Top
Schön, dann kannst Du den Thread ja noch als gelöst markieren.

Und von wegen "Seite mit Danke-Postings vollschreiben" - Lass mal face-wink
Member: lordofremixes
lordofremixes Aug 31, 2011 at 15:58:48 (UTC)
Goto Top
Hallo Friemler,

kleines Problemchen noch.
An meinem PC ging das wunderbar, hab das jetzt auf dem PC wo dann in Echtzeit die DNC Dateien reinkommen ausprobiert, als Admin installiert , vbs Datei angepasst (Ordner), aber er ändert die neuen Dateien nicht.
Liegt das vielleicht daran dass er in 1 sec. nicht alle 9800 Dateien überprüfen kann?
Wo kann mein Fehler liegen?
Member: Friemler
Friemler Aug 31, 2011 at 16:10:17 (UTC)
Goto Top
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 face-wink 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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 16:36:09 (UTC)
Goto Top
Hallo Friemler,

ich habe es ganz genau nach deiner Anleitung hier an diesem PC gemacht. Ich habe die beiden vbs Dateien, die ich auch an dem Testrechner benutzt habe, auf den Rechner hier kopiert (unter C:\dnc programme cnc).
Dann habe ich in der installer.vbs den pfad für die dnc dateien angepasst (C:\CNC Programme DNC\M1).
Dann cmd als Administrator durchgeführt in das Verzeichnis gewechselt und "cscript /nologo Installer.vbs" eingegeben.
Das hat dann ca. 1 Minute gedauert (PC ist ein bisschen älter) und ohne Fehlermeldung abgeschlossen. Dann bin ich zur Maschine und habe eine DNC Datei rübergeschickt. Zum PC und siehe da (sieht man ja auch schon am Änderungsdatum), die Datei ist genauso falsch wie es nicht sein sollte.
Habe dann manuell falsche dnc Dateien reinkopiert (so wie an meinem Testrechner), an meinem PC hat er sie sofort geändert. Hier macht er garnichts, die CPU Auslastung ist aber konstant zwischen 96-und 99 % und der Lüfter ziemlich laut.
Werd noch verrückt ;)

Gruß
Member: Friemler
Friemler Aug 31, 2011 at 16:48:17 (UTC)
Goto Top
Hallo lordofremixes,

hast Du denn auch C:\CNC Programme DNC\M1\*.dnc eingetragen? Um welche Windowsversion handelt es sich?

Gruß
Friemler
Member: Friemler
Friemler Aug 31, 2011 at 17:04:37 (UTC)
Goto Top
Hallo lordofremixes,

in Deinem letzten Posting des Installer Codes habe ich gerade gesehen, dass Du in Zeile 137 statt
Set objFilterClass                   = objWMIService.Get("__EventFilter")
diese Zeile
Set objFilterClass = objWMIService.Get("EventFilter")
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
Member: Skyemugen
Skyemugen Aug 31, 2011 at 17:17:33 (UTC)
Goto Top
Zitat von @Friemler:
[EDIT]
Ich glaube die Fettschrift hier ist Deine Schuld face-wink 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]
Member: Skyemugen
Skyemugen Aug 31, 2011, updated at Oct 18, 2012 at 16:48:07 (UTC)
Goto Top
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 face-wink

P.S.: Kommentare die vor dem Bugpost landen, bleiben normal also alles, das vor der Struktur von 16:45:31 Uhr landet face-wink Beweis

P.P.S.: er lernt es nicht mit den Codetags ...

late edit: Wer hat das Fett verbraten?
Member: Skyemugen
Skyemugen Aug 31, 2011 at 17:22:55 (UTC)
Goto Top
Er meint, dass der Codeschnipsel von unserem hochgeschätzten Mitglied bastla stammt face-wink
Member: lordofremixes
lordofremixes Aug 31, 2011 at 17:23:30 (UTC)
Goto Top
Hallo Friemler,

grade verglichen. Der Code hier ist richtig. Das angegebene Verzeichnis ist auch richtig. Hier läuft Win XP , Service Pack 3.


Ich poste noch einmal die beiden Codes hier am Echtzeit PC , die ich genommen habe.
Fahre dann kurz heim (ca. 20min) und schalte mich dann wieder hier drauf.

Mit der Codeformatierung , habe bei Formatierungshilfe geschaut aber den Code für die Zeilennummerierung finde ich nicht (zu spät?). Danke dass du dich so unermüdlich drum kümmerst, rechne ich dir hoch an.!!
Member: lordofremixes
lordofremixes Aug 31, 2011 at 17:24:47 (UTC)
Goto Top
der Code von installer.vbs:

 ' ===========================================  
 ' Run this script with administrative rights!  
 ' ===========================================  
 '/////////////////////////////// Configure script's job ///////////////////////////////  
 '******************** Customize according to your specific needs **********************  
 '------------------ Set event description and job related variables -------------------  
 strEventDescription  = "New DNCfile Creation"  
 strMonitorFileSpec   = "C:\CNC Programme DNC\M1\*.dnc"  
 strPollingIntervall  = "1"  
 '---------------- Prepare Monitor Filespec for WMI Event Filter query -----------------  
 Set FSO              = CreateObject("Scripting.FileSystemObject")  
 strDrive             = FSO.GetDriveName(strMonitorFileSpec)
 strFileName          = FSO.GetFileName(strMonitorFileSpec)
 intPathBegin         = Len(strDrive) + 1
 intPathLen           = Len(strMonitorFileSpec) - Len(StrDrive) - Len(strFileName)
 strPath              = Replace(Mid(strMonitorFileSpec, intPathBegin, intPathLen), "\", "\\")  
 strExtension         = FSO.GetExtensionName(strMonitorFileSpec)
 Set FSO              = Nothing
 '----------------------------- Set WMI Event Filter query -----------------------------  
 strEventFilterQuery  = "SELECT * FROM __InstanceCreationEvent" _  
 & " WITHIN " & strPollingIntervall _  
 & " WHERE TargetInstance ISA 'CIM_DataFile'" _  
 & " AND TargetInstance.Drive='" & strDrive & "'" _  
 & " AND TargetInstance.Path='" & strPath & "'" _  
 & " AND TargetInstance.Extension='" & strExtension & "'"  
 '-------------- Set WMI Namespace where the monitored event will occure ---------------  
strEventNamespace    = "root\Cimv2"  
'----------- Set parameters which should be passed to Event Handler script ------------  
 strEventHandlerParam = """" _  
  & "%TargetInstance.Drive%" _  
  & "%TargetInstance.Path%" _  
  &   "%TargetInstance.FileName%" _  
   & "." _  
 & "%TargetInstance.Extension%" _  
 & """"  
'**************************************************************************************  
'//////////////////////////////// Set script variables ////////////////////////////////  
'- Set Event Handler path, quote it and prepare it and its working directory for WMI --  
Set FSO           = CreateObject("Scripting.FileSystemObject")  
strEventHandlerWD = Replace(FSO.GetParentFolderName(WScript.ScriptFullName), "\", "\\")  
strEventHandler   = Replace(strEventDescription, " ", "") & "EventHandler.vbs"  
strEventHandler   = """" & strEventHandlerWD & "\\" & strEventHandler & """"  
Set FSO           = Nothing
'----------------------- Test for existing Event Handler script -----------------------  
Set FSO = CreateObject("Scripting.FileSystemObject")  
If Not FSO.FileExists(Replace(Replace(strEventHandler, "\\", "\"), """", "")) Then  
  MsgBox "The Event Handler script " & vbCRLF _  
          & Replace(strEventHandler, "\\", "\") & vbCRLF _  
          & "does not exist. Please create it.", _  
         vbExclamation, _
         "Missing Event Handler script"  
End If
Set FSO = Nothing
'-------------------------- Build parameters for CScript.exe --------------------------  
strCScriptParam = strEventHandler & " " & strEventHandlerParam  
'---------------- Get path of Windows Directory and prepare it for WMI ----------------  
Set WshShell    = WScript.CreateObject("WScript.Shell")  
strWinDir       = Replace(WshShell.ExpandEnvironmentStrings("%SystemRoot%"), "\", "\\")  
Set WshShell    = Nothing
 '---------------------- Set path of CScript.exe prepared for WMI ----------------------  
 setCScriptPath  = strWinDir & "\\System32\\cscript.exe"  
 '////////////////////////// Install permanent Event Consumer //////////////////////////  
 '------- Get WMI Scripting API object (SWbemServices), Namespace: Subscription --------  
  strComputer                          = "."  
 Set objWMIService                    = GetObject("winmgmts:" _  
 & "{impersonationLevel=impersonate}!" _  
   & "\\" & strComputer & "\root\Subscription")  
  '------------------------------ Create the Event Filter -------------------------------  
  Set objFilterClass                   = objWMIService.Get("__EventFilter")  
  Set objFilter                        = objFilterClass.SpawnInstance_()
  objFilter.Name                       = strEventDescription & " Event Filter"  
  objFilter.EventNamespace             = strEventNamespace
  objFilter.QueryLanguage              = "WQL"  
  objFilter.Query                      = strEventFilterQuery
  Set EventFilterPath                  = objFilter.Put_()
  '----------------------- Create the Commandline Event Consumer ------------------------  
  Set objEventConsumerClass            = objWMIService.Get("CommandLineEventConsumer")  
  Set objEventConsumer                 = objEventConsumerClass.SpawnInstance_()
  objEventConsumer.Name                = strEventDescription & " Commandline Event Consumer"  
  objEventConsumer.CommandLineTemplate = setCScriptPath & " " & strCScriptParam  
  objEventConsumer.ExecutablePath      = setCScriptPath
  objEventConsumer.WorkingDirectory    = strEventHandlerWD
  objEventConsumer.ShowWindowCommand   = 0
  Set CommandlineEventConsumerPath     = objEventConsumer.Put_()
  '------------------ Bind Event Filter to Commandline Event Consumer -------------------  
    Set objBindingClass                  = objWMIService.Get("__FilterToConsumerBinding")  
  Set objBinding                       = objBindingClass.SpawnInstance_()
  objBinding.Filter                    = EventFilterPath
  objBinding.Consumer                  = CommandlineEventConsumerPath
  objBinding.Put_()

[Edit Biber] Codeformatierung [/Edit]
Member: lordofremixes
lordofremixes Aug 31, 2011 at 17:26:27 (UTC)
Goto Top
Der Code von NewDNCFileCreationEventHandler.vbs :
'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
Member: Friemler
Friemler Aug 31, 2011 at 17:29:58 (UTC)
Goto Top
Hallo lordofremixes,

Zitat von @lordofremixes:
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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 17:30:01 (UTC)
Goto Top
installer ohne Fettschrift (sry)
' ===========================================  
 ' Run this script with administrative rights!  
 ' ===========================================  
 '/////////////////////////////// Configure script's job ///////////////////////////////  
 '* Customize according to your specific needs *  
 '------------------ Set event description and job related variables -------------------  
 strEventDescription  = "New DNCfile Creation"  
 strMonitorFileSpec   = "C:\CNC Programme DNC\M1\*.dnc"  
 strPollingIntervall  = "1"  
 '---------------- Prepare Monitor Filespec for WMI Event Filter query -----------------  
 Set FSO              = CreateObject("Scripting.FileSystemObject")  
 strDrive             = FSO.GetDriveName(strMonitorFileSpec)
 strFileName          = FSO.GetFileName(strMonitorFileSpec)
 intPathBegin         = Len(strDrive) + 1
 intPathLen           = Len(strMonitorFileSpec) - Len(StrDrive) - Len(strFileName)
 strPath              = Replace(Mid(strMonitorFileSpec, intPathBegin, intPathLen), "\", "\\")  
 strExtension         = FSO.GetExtensionName(strMonitorFileSpec)
 Set FSO              = Nothing
 '----------------------------- Set WMI Event Filter query -----------------------------  
 strEventFilterQuery  = "SELECT * FROM __InstanceCreationEvent" _  
 & " WITHIN " & strPollingIntervall _  
 & " WHERE TargetInstance ISA 'CIM_DataFile'" _  
 & " AND TargetInstance.Drive='" & strDrive & "'" _  
 & " AND TargetInstance.Path='" & strPath & "'" _  
 & " AND TargetInstance.Extension='" & strExtension & "'"  
 '-------------- Set WMI Namespace where the monitored event will occure ---------------  
strEventNamespace    = "root\Cimv2"  
'----------- Set parameters which should be passed to Event Handler script ------------  
 strEventHandlerParam = """" _  
  & "%TargetInstance.Drive%" _  
  & "%TargetInstance.Path%" _  
  &   "%TargetInstance.FileName%" _  
   & "." _  
 & "%TargetInstance.Extension%" _  
 & """"  
'*  
'//////////////////////////////// Set script variables ////////////////////////////////  
'- Set Event Handler path, quote it and prepare it and its working directory for WMI --  
Set FSO           = CreateObject("Scripting.FileSystemObject")  
strEventHandlerWD = Replace(FSO.GetParentFolderName(WScript.ScriptFullName), "\", "\\")  
strEventHandler   = Replace(strEventDescription, " ", "") & "EventHandler.vbs"  
strEventHandler   = """" & strEventHandlerWD & "\\" & strEventHandler & """"  
Set FSO           = Nothing
'----------------------- Test for existing Event Handler script -----------------------  
Set FSO = CreateObject("Scripting.FileSystemObject")  
If Not FSO.FileExists(Replace(Replace(strEventHandler, "\\", "\"), """", "")) Then  
  MsgBox "The Event Handler script " & vbCRLF _  
          & Replace(strEventHandler, "\\", "\") & vbCRLF _  
          & "does not exist. Please create it.", _  
         vbExclamation, _
         "Missing Event Handler script"  
End If
Set FSO = Nothing
'-------------------------- Build parameters for CScript.exe --------------------------  
strCScriptParam = strEventHandler & " " & strEventHandlerParam  
'---------------- Get path of Windows Directory and prepare it for WMI ----------------  
Set WshShell    = WScript.CreateObject("WScript.Shell")  
strWinDir       = Replace(WshShell.ExpandEnvironmentStrings("%SystemRoot%"), "\", "\\")  
Set WshShell    = Nothing
 '---------------------- Set path of CScript.exe prepared for WMI ----------------------  
 setCScriptPath  = strWinDir & "\\System32\\cscript.exe"  
 '////////////////////////// Install permanent Event Consumer //////////////////////////  
 '------- Get WMI Scripting API object (SWbemServices), Namespace: Subscription --------  
  strComputer                          = "."  
 Set objWMIService                    = GetObject("winmgmts:" _  
 & "{impersonationLevel=impersonate}!" _  
   & "\\" & strComputer & "\root\Subscription")  
  '------------------------------ Create the Event Filter -------------------------------  
  Set objFilterClass                   = objWMIService.Get("__EventFilter")  
  Set objFilter                        = objFilterClass.SpawnInstance_()
  objFilter.Name                       = strEventDescription & " Event Filter"  
  objFilter.EventNamespace             = strEventNamespace
  objFilter.QueryLanguage              = "WQL"  
  objFilter.Query                      = strEventFilterQuery
  Set EventFilterPath                  = objFilter.Put_()
  '----------------------- Create the Commandline Event Consumer ------------------------  
  Set objEventConsumerClass            = objWMIService.Get("CommandLineEventConsumer")  
  Set objEventConsumer                 = objEventConsumerClass.SpawnInstance_()
  objEventConsumer.Name                = strEventDescription & " Commandline Event Consumer"  
  objEventConsumer.CommandLineTemplate = setCScriptPath & " " & strCScriptParam  
  objEventConsumer.ExecutablePath      = setCScriptPath
  objEventConsumer.WorkingDirectory    = strEventHandlerWD
  objEventConsumer.ShowWindowCommand   = 0
  Set CommandlineEventConsumerPath     = objEventConsumer.Put_()
  '------------------ Bind Event Filter to Commandline Event Consumer -------------------  
    Set objBindingClass                  = objWMIService.Get("__FilterToConsumerBinding")  
  Set objBinding                       = objBindingClass.SpawnInstance_()
  objBinding.Filter                    = EventFilterPath
  objBinding.Consumer                  = CommandlineEventConsumerPath
  objBinding.Put_()
Member: Friemler
Friemler Aug 31, 2011 at 17:30:53 (UTC)
Goto Top
CODEFORMATIERUNG BITTE! Oder ich kriege die Krise! Du musst auch nicht jedesmal ein neues Posting einstellen, Du kannst bestehende Postings ÄNDERN! Link "Bearbeiten" rechts unter Deinem Beitrag.

[EDIT]
Die schon erwähnte Zeile ist immer noch falsch.
[/EDIT]
Member: lordofremixes
lordofremixes Aug 31, 2011 at 17:37:27 (UTC)
Goto Top
sorry heut s erste mal hier. wie bekomm ich die zeilennummerierung hin?
Member: Friemler
Friemler Aug 31, 2011 at 17:41:50 (UTC)
Goto Top
Siehe dieses Posting.
Member: lordofremixes
lordofremixes Aug 31, 2011 at 18:13:01 (UTC)
Goto Top
so jetzt hab ich solangsam die grundregeln drauf ;) blöde hektik...
Member: Friemler
Friemler Aug 31, 2011 at 18:22:32 (UTC)
Goto Top
Vielen Dank! Hektik ist ein schlechter Partner in der IT.

Hast Du Zeile 69
Set objFilterClass                   = objWMIService.Get("__EventFilter")
im Listing des Installers verbessert oder sind die führenden Tiefstriche vor EventFilter erst durch die Codeformatierung aufgetaucht? So sollte es richtig sein.

Gruß
Friemler
Member: lordofremixes
lordofremixes Aug 31, 2011 at 18:30:03 (UTC)
Goto Top
so steht es bei mir im code
Set objFilterClass = objWMIService.Get("__EventFilter") (so rauskopiert)

Gruß
Member: Friemler
Friemler Aug 31, 2011 at 18:49:01 (UTC)
Goto Top
Hallo lordofremixes,

ich habe gerade die Listings aus Deinen letzten (endlich mit Codeformatierung versehenen face-wink ) 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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 19:01:30 (UTC)
Goto Top
Hallo Friemler,

habe es ja auch an meinem PC ausprobiert und es ging.
So habe jetzt folgendes ausprobiert : Habe die Installer.vbs so angepasst , dass sie nicht auf "C:\CNC Programme DNC\M1\*.dnc" zugreift, sondern nur auf "C:\CNC Programme DNC\*.dnc" , fehlerhafte dnc Datei reinkopiert und eine Sekunde später war die DNC Datei genauso wie gewünscht.
Das finde ich echt merkwürdig. Liegt es vielleicht daran, dass der Ordner zu voll ist (sind ca. 9800 dnc Dateien) ?

Gruß

Anmerkung: Die Ausführung der installer.vbs war in wenigen Sekunden erledigt, gibt man noch ...\M1\ an, dauert es ca. 1 Minute bis das Installer Programm fertig ausgeführt st.
Member: Friemler
Friemler Aug 31, 2011 at 19:08:54 (UTC)
Goto Top
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.

  1. Unter einem Konto anmelden, das zur Gruppe der Administratoren gehört.
  2. Starte über Rechtsklick -> Als Administrator ausführen ein Konsolenfenster mit Adminrechten (für XP nicht erforderlich).
  3. Gib dort den Befehl wbemtest ein.
  4. Klicke im Fenster dieses Programms rechts oben auf Verbinden....
  5. Ändere den Inhalt des Eingabefeldes unter Namespace (ganz oben) auf root\subscription und klicke rechts oben auf Verbinden.
  6. Klicke jetzt im Hauptfenster auf Instanzen aufzählen....
  7. Trage unter Name der übergeordneten Klasse den Begriff __FilterToConsumerBinding ein (genau so, mit den zwei führenden Tiefstrichen!) und klicke auf OK.
  8. 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 auf Schließen klicken.
  9. Wiederum im Hauptfenster auf Instanzen aufzählen... klicken.
  10. Trage unter Name der übergeordneten Klasse den Begriff __EventFilter ein (genau so, mit den zwei führenden Tiefstrichen!) und klicke auf OK.
  11. 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 auf Schließen klicken.
  12. Wiederum im Hauptfenster auf Instanzen aufzählen... klicken.
  13. Trage unter Name der übergeordneten Klasse den Begriff CommandLineEventConsumer ein und klicke auf OK.
  14. 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 auf Schließen klicken.
  15. 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
Member: bastla
bastla Aug 31, 2011, updated at Oct 18, 2012 at 16:48:07 (UTC)
Goto Top
@Skyemugen
"Hochgeschätzt" macht mich ja wirklich fast verlegen face-wink (Biber würde mich übrigens eher "breit" schätzen face-wink) ...

... 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 ... face-wink
Member: Biber
Biber Aug 31, 2011 at 19:35:42 (UTC)
Goto Top
@bastla
Zitat von @bastla:
@Skyemugen
"Hochgeschätzt" macht mich ja wirklich fast verlegen face-wink (Biber würde mich übrigens eher "breit" schätzen face-wink) ...
Biber würde sagen: Nicht nur grosse Ereignisse werfen ihre Schatten voraus face-wink

P.S.: Ich wollte auch noch mit in den Bereich, in dem Mann nicht fett rüberkommt ... face-wink
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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 19:40:18 (UTC)
Goto Top
Hallo Friemler,

genauso gemacht (habe sogar jede Zeile zweimal gelesen). Hat alles wunderbar funktioniert. Danach Verzeichnis angepasst (M1) und neu installiert. Installation ging deutlich schneller.
Im Ordner M1 werden die DNC Dateien trotzdem nicht angepasst. Habe das Intervall auf 30 Sekunden gesetzt.
Denke mal mit dem Ordner M1 kann ichs vergessen oder hast du noch ne Idee , warum es ausgerechnet bei diesem Ordner scheitert?

Gruß
lordofremixes
Member: bastla
bastla Aug 31, 2011 at 19:40:53 (UTC)
Goto Top
@Biber
jezz' aber weeeeeeech hier...
Nur keine Eile - Du bist ja sicher ohnehin schneller (öfters sogar beim Batchen face-wink) ...

Grüße
bastla
Member: Friemler
Friemler Aug 31, 2011 at 19:48:09 (UTC)
Goto Top
Hallo lordofremixes,

hmm, das muss dann wohl an der großen Anzahl Dateien liegen. Werden denn wirklich alle davon benötigt/kannst Du einen Teil auslagern?

Gruß
Friemler
Member: lordofremixes
lordofremixes Aug 31, 2011 at 19:55:57 (UTC)
Goto Top
Hallo Friemler,

leider nicht, wollte ich auch schon probieren, das Problem ist nur, dass die Arbeiter an der Maschine irgendwann so gut wie jedes Programm brauchen können bzw. man auch garnicht wissen kann, was man von den 9800 auslagern kann. Hab da noch ne Idee kann man hier nen Screenshot hochladen?
Gruß
Member: Friemler
Friemler Aug 31, 2011 at 20:05:49 (UTC)
Goto Top
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
Member: Skyemugen
Skyemugen Aug 31, 2011 at 20:18:26 (UTC)
Goto Top
Zitat von @Friemler:
[OT]
Das hat er ja schon hier kundgetan.
Interessant, das stand ursprünglich noch nicht da, hatte er wohl im Nachhinein noch mit zugeschummelt (gut vor vielen Stunden inzwischen aber hier hält doch auch niemand mehr den Überblick bei dem Chaos im Thread)
[/OT]
Member: lordofremixes
lordofremixes Aug 31, 2011 at 20:25:14 (UTC)
Goto Top
ok hab ich gemacht.
das ist das ftp verwaltungsprogramm, welches auch auf den ordner m1 zugreift.

fällt dir da vielleicht etwas auf?
Member: Friemler
Friemler Aug 31, 2011 at 20:29:54 (UTC)
Goto Top
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.
Member: lordofremixes
lordofremixes Aug 31, 2011 at 20:41:31 (UTC)
Goto Top
habe ich genauso gemacht, bild wird bei mir angezeigt, hab aber noch nicht freigegeben oder soll ich das jetzt, wenn ich fertig bin?
eb4f9fb27c90e5a24b4c3a632bff9399

das ist das ftp programm . vielleicht fällt dir da was auf , was eine änderung sperrt?
Member: Friemler
Friemler Aug 31, 2011 at 20:44:29 (UTC)
Goto Top
Nein, nicht freigeben. Du hast wahrscheinlich den Link zu Deinem neu erstellten Beitrag gepostet. Der Link aus der Uploadbox sieht z.B. so aus:
[[image bad3baa36aa3ddf481dbd44fb82d2e5a]]

[EDIT]
Aha, hat sich ja erledigt.
[/EDIT]
289ac0449deb817ce2cbe7839797d03a
Member: Friemler
Friemler Aug 31, 2011 at 20:51:13 (UTC)
Goto Top
Werden die DNC-Dateien vom FTP-Programm etwa nach C:\cnc programme dnc (das Home-Verzeichnis) geschrieben?
Member: lordofremixes
lordofremixes Aug 31, 2011 at 20:59:05 (UTC)
Goto Top
nein, in C:\cnc programme dnc\m1
(der ordner, in dem die ganzen dnc dateien von der maschine landen oder ausgelesen werden + der ordner, in dem dein programm dann nicht will)

Gruß
Member: Friemler
Friemler Aug 31, 2011 at 21:09:28 (UTC)
Goto Top
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 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
Member: lordofremixes
lordofremixes Aug 31, 2011 at 21:14:20 (UTC)
Goto Top
Friemer,

ich bin grad auch nicht mehr fitt. muss jetzt mal abschalten. Du hast mir heute sehr viel geholfen, ich probiere das morgen früh gleich aus.

N8, too und danke nochmals.
Bis morgen, Lordofremixes
Member: Dani
Dani Aug 31, 2011 at 21:18:38 (UTC)
Goto Top
Moin,
gratuliere... 100 Kommentare innerhalb von ca. 12 Stunden. Das ist neuer Rekord!


Grüße,
Dani
Member: lordofremixes
lordofremixes Sep 01, 2011 at 07:13:17 (UTC)
Goto Top
Hallo Friemler,

habe grad noch mal getestet, und zwar wenn ich den ...\M1 Ordner leere und manuell 5 fehlerhafte dnc Dateien einfüge, korrigiert er sofort.
Also keine Sperre vom ftp Programm, oder was auch immer, es liegt wahrscheinlich an den 9800 Dateien, sobald diese wieder drin sind, wird garnichtrs mehr gemacht.
weiß da vielleicht noch jemand ne lösung?

Gruß
Member: lordofremixes
lordofremixes Sep 01, 2011 at 07:16:30 (UTC)
Goto Top
Halo Skyemugen,

Deine Batch Datei beim Testen prima funktioniert, aber im richtigen Verzeichnis mit 9800 Dateien macht die Batch Datei garnichts bzw.bleibt hängen.

Gruß
Member: Skyemugen
Skyemugen Sep 01, 2011 at 07:33:53 (UTC)
Goto Top
Aloha,

ehrlich ja? Die arbeitet schon noch *gg* aber ich glaube auch nicht, dass du etliche Stunden abgewartet hast, denn ich schätze 9800 Dateien abzuarbeiten mit diesem Vorgang wird wohl nunja ... 3-12 Stunden dauern ...

greetz André

erstmal frühstücken
Member: Friemler
Friemler Sep 01, 2011 at 08:08:23 (UTC)
Goto Top
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
cscript /nologo "PfadUndNameDesFolgendenScripts.vbs"
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 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
Member: Skyemugen
Skyemugen Sep 01, 2011 at 08:14:45 (UTC)
Goto Top
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:
  • 9800 vorhandene Dateien ändern
  • immer wieder neue Dateien ändern

Letzteres geht reibungslos, ersteres braucht viiiieeeel Kaffee

greetz André
Member: Friemler
Friemler Sep 01, 2011 at 08:24:11 (UTC)
Goto Top
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 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. [EDIT] Zu schnell gelesen. [/EDIT]

Gruß
Friemler
Member: Skyemugen
Skyemugen Sep 01, 2011 at 08:35:40 (UTC)
Goto Top
Aloha Friemler,

bei 9800 Dateien mit gesetztem Archivbit sind 9800 Dateien zur Verarbeitung vorhanden face-wink

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

greetz André
Member: Friemler
Friemler Sep 01, 2011 at 08:38:29 (UTC)
Goto Top
Hallo André,

stimmt, deshalb habe ich gerade noch einen Hinweis in mein Posting eingebaut, dass er die Archivbits vor Einrichtung des Tasks erstmal mit ATTRIB löschen soll.

Gruß
Friemler
Member: lordofremixes
lordofremixes Sep 01, 2011 at 08:54:56 (UTC)
Goto Top
Hallo Friemler,

so bin jetzt wieder am Steuerungs PC.
Das mit dem Task bekomme ich auf jeden Fall hin.
Vorgehensweise, damit nichts schief geht:

Ich lass den SteuerungsPC so wie er ist . Deine Programme sind installiert. Der Pfad ist richtig angepasst (...\M1) und das Intervall steht auf 10 sec.
Ich erstelle eine neue VBS Datei mit deinem neuen Code und führe sie wie oben beschrieben aus.
Stimmt das soweit?
Was mir unklar ist bzw. nicht ganz genau verstanden: Es liegen nur korrekte DNC Dateien im Verzeichnis, wie soll ich genau vorgehen. Mit der Eingabeaufforderung in das M1 verzeichnis wechseln und dann ATTRIB eingeben?

Gruß
lordofremixes
Member: Friemler
Friemler Sep 01, 2011 at 09:16:41 (UTC)
Goto Top
Moin lordofremixes,

zunächst mal: Die ganze Ackererei von gestern war umsonst face-sad . 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
Member: lordofremixes
lordofremixes Sep 01, 2011 at 10:00:59 (UTC)
Goto Top
Du Genie !!

Es funktioniert einwandfrei!!

kleinigkeit noch die ich nicht hinbekomme (wahrscheinlich liegts an der schreibweise)

wollt für dein programm eine batch anlegen, und diese dann in den taskmanager.
Beim Anlegen der Batch Datei habe ich folgendes reingeschrieben, aber es kommt ein Fehler (wahrscheinlich liegt an der Schreibwei"C:\CNC Programme DNC\Script" -cscript /nologo "DNC.vbs"se)

"C:\CNC Programme DNC\Script" -cscript /nologo "DNC.vbs" diese habe ich dann als .bat angelegt da kommt aber immer ein fehler
was mach ich da falsch?

UND

Gilt der Taskplaner eigentlich für alle User(wenn ich ihn als Admin anlege) oder muss ich es einmal für jeden einzelnen definieren?

bald ist der beitrag glaub ich echt gelöst face-smile

Danke und Gruß,
Lordofremixes
Member: Friemler
Friemler Sep 01, 2011 at 10:15:52 (UTC)
Goto Top
Wie wäre es mit
cscript /nologo "C:\CNC Programme DNC\Script\DNC.vbs"

Beim Erstellen des Tasks muss Benutzername und Passwort angegeben werden, nicht wahr? Unter diesem Konto wird der Task ausgeführt.

Gruß
Friemler
Member: lordofremixes
lordofremixes Sep 01, 2011 at 11:31:51 (UTC)
Goto Top
Hallo Friemler,

alles eingerichtet um 13. 45 finden dann Test s an der Maschine statt. Hab ein wirklich gutes Gefühl dabei!!

Danke für alles ! Wenn es klappt, wo soll ich den Kasten Bier hinschicken? ;)

Gruß
LordofRemixes
Member: Friemler
Friemler Sep 01, 2011 at 11:37:40 (UTC)
Goto Top
Zitat von @lordofremixes:
Wenn es klappt, wo soll ich den Kasten Bier hinschicken? ;)

Spende ihn der örtlichen Obdachloseneinrichtung face-wink .

Ciao
Friemler
Member: lordofremixes
lordofremixes Sep 01, 2011 at 18:40:46 (UTC)
Goto Top
Hallo Friemler,

nach ausgiebigen Tests muss ich eins sagen:

ES LÄUFT HERVORRAGEND !! (nach gestern abend hatte ich die hoffnung eigentlich schon aufgegeben;)) Aber du hast es echt drauf !!!

DANKE VIELMALS NOCHMAL!!


mein chef war übrigens überglücklich !!

Gruß
Lordofremixes
Member: Friemler
Friemler Sep 01, 2011 at 19:09:06 (UTC)
Goto Top
Hallo lordofremixes,

freut mich, dann kannst Du den Beitrag ja noch als gelöst markieren. 118 Kommentare und kein grüner Haken macht sich schlecht face-wink .

Gruß
Friemler
Member: lordofremixes
lordofremixes Sep 06, 2011 at 11:12:42 (UTC)
Goto Top
Hallo Friemler,

Deine Lösung läuft im Produktiv Betrieb echt gut. Ein Problem gibt es aber noch:

Kann es sein, dass wenn jemand ein richtiges DNC Programm einlädt und da Änderungen vornimmt z.B. 877251.dnc :

$$ (877251)
%PM
N877251 (LAGERGEHAUSE 315UPZ)
N10 M59
N20 G54
N30 G199 X131 Z215 C1 A1

Der Arbeiter an der Maschine ändert nur z.B. Zeile 4 in :

$$ (877251)
%PM
N877251 (LAGERGEHAUSE 315UPZ)
N10 M65
N20 G54
N30 G199 X131 Z215 C1 A1

und schickt dies zurück an den Server. Die 4. Zeile wird nicht überschrieben, nicht verändert. Das ist unvorteilhaft, wenn er kleine Korrekturen an einer Datei vornimmt
und diese dann korrigiert ablegen will.

Woran kann das liegen?

Gruß
LordofRemixes
Member: Friemler
Friemler Sep 06, 2011 at 14:26:59 (UTC)
Goto Top
Hallo lordofremixes,

Zitat von @lordofremixes:
Woran kann das liegen?

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
Member: lordofremixes
lordofremixes Sep 07, 2011 at 09:23:57 (UTC)
Goto Top
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?

Gruß
lordofremixes
Member: Friemler
Friemler Sep 07, 2011 at 10:00:54 (UTC)
Goto Top
Hallo lordofremixes,

Zitat von @lordofremixes:
gibt es die Möglichkeit, den Aufruf der Dosbox minimiert darzustellen?

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 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
Mitglied: 60730
60730 Sep 07, 2011 at 10:17:03 (UTC)
Goto Top
Moin,

[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?

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
Member: Friemler
Friemler Sep 07, 2011 at 11:00:12 (UTC)
Goto Top
Moin Timo,

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

noch banaler ist doch der Austausch von cscript.exe gegen wscript.exe. Wie war das mit den blinden (ungelernten) Hühnern? face-wink

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
Member: lordofremixes
lordofremixes Sep 08, 2011 at 07:08:55 (UTC)
Goto Top
Hallo TimoBeil,

ich finde es eine Frechheit, dass du sagst, ich hätte das ganze Lob abbekommen. Woher willst du das denn wissen?
Ich hab meinem Chef genau gesagt, dass ich zum ersten Mal etwas in ein Forum geschrieben hab und mir jemand das Problem ausführlich gelöst hat.
Außerdem, bevor du geantwortet hast, hab ich auch schon rausgefunden wie man die Batch Datei minimiert öffnet , von daher gucke ich schon immer dass ich so viel wie möglich selbst löse. und das mit dem vb script davon hab ich keine ahnung und hab hier nur gefragt ob jemand eine fertige lösung präsentieren kann.
das ist doch nicht verboten??

Gruß
LordofRemixes
Member: lordofremixes
lordofremixes Sep 08, 2011 at 07:12:54 (UTC)
Goto Top
Danke ^^,

also das 2. lehrjahr ist vorbei seit 31. august. hatte einen schnitt von 1,8 im zeugnis, denke mal schon dass da was geht.

hab es mit start /MIN cscript /nologo "C:\CNC Programme DNC\Script\DNC.vbs" probiert, das ging einwandfrei.
oder hat die lösung mit wscript gegenüber start /MIN einen Vorteil?

Gruß
Lordofremixes
Member: Friemler
Friemler Sep 08, 2011 at 11:04:17 (UTC)
Goto Top
Hallo lordofremixes,

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önntest
wscript  "C:\CNC Programme DNC\Script\DNC.vbs"
auch direkt in den Taskplaner eintragen.

Gruß
Friemler
Mitglied: 60730
60730 Sep 08, 2011 at 11:20:16 (UTC)
Goto Top
Servus und [OT]
Zitat von @lordofremixes:
Hallo TimoBeil,

ich finde es eine Frechheit

.. 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ß
Member: lordofremixes
lordofremixes Oct 11, 2011 at 10:53:18 (UTC)
Goto Top
Hallo Friemler,

seit einigen Tagen funktioniert das Script nicht mehr. Habe fehlerhafte dnc Dateien eingefügt. Eine davon sieht so aus:

$$ (9999990)
%PM
N3859961 (SIEBKORB)
N5 M59
N10 G54
N20 G199 X510 Z128 C1 A1
usw...

Der Dateiname ist 9999990.dnc. Das Archivbit ist gesetzt (müsste ja gesetzt sein, wenn ich die Datei frisch in den Ordner reinsetze). Es passiert einfach nichts, das Änderungsdatum bleibt auch gleich. Die Batchdatei startet jede Minute. Weißt du zufällig warum das so ist.

Manchmal kommt auch folgendes vor. Man will eine DNC Datei speichern, und es passiert folgendes:

Er speichert dann 2. DNC Dateien:

1. %PM
N1313605 (SCHNECKE)
N10 M59
N20 G54
N30 G199 X70 Z672 C1 A1
N40 G198 X0 Z672
N50 G1 X174
N60 G1 Z652
N70 G1 X90
N80 G1 X70 Z642
N90 G1 Z0
N100 G1 X0
N110 G1 Z672
N120 G196
N130 T2203 M4
N140 G96 D500 S180 M38
N150 G0 X178 Z0.2 M8
N160 G39 X12 Z0 C0.5 F0.25
N170 G0 X450 Z50
N180 T1013 M4
N190 G96 S180 M38
N200 G0 X175 Z2 M8
N210 G38 X170.5 Z-21 C3 F0.35
N220 G0 X450 Z50
N230 T2203 M4
N240 G96 S250 M38
N250 G0 X165 Z4
N260 G1 Z0.05 F0.5 T2 M8
N270 G15 X168.5 K0.7 F0.16
N280 G1 Z-21
N290 G1 X175 F0.5 T3 M9
N300 G0 X450 Z50
N310 T4373 M4
N320 G96 S160 M38
N330 G0 X175 Z2
N340 G1 X77 F2
N350 G1 Z-1 F0.16 M8
N360 G1 X20
N370 G1 Z1 M9
N380 G0 X200
N390 G0 X420 Z50
N400 T5073 M4
N410 G96 D400 S160 M38
N420 G0 X175 Z-15
N430 G1 X170.2 F0.2 T2 M8
N440 G15 Z-18 K0.6
N450 G15 X70 K8
N460 G1 Z-32 T3 M9
N470 G0 X200
N480 G0 X390 Z100
N490 M5
N500 M58
N510 M30
und dann noch zusätzlich die zweite Datei.

$$ (1313605)
%PM
N1313605 (SCHNECKE)
N10 M59
N20 G54
N30 G199 X70 Z672 C1 A1
N40 G198 X0 Z672
N50 G1 X174
N60 G1 Z652
N70 G1 X90
N80 G1 X70 Z642
N90 G1 Z0
N100 G1 X0
N110 G1 Z672
N120 G196
N130 T2203 M4
N140 G96 D500 S180 M38
N150 G0 X178 Z0.2 M8
N160 G39 X12 Z0 C0.5 F0.25
N170 G0 X450 Z50
N180 T1013 M4
N190 G96 S180 M38
N200 G0 X175 Z2 M8
N210 G38 X170.5 Z-21 C3 F0.35
N220 G0 X450 Z50
N230 T2203 M4
N240 G96 S250 M38
N250 G0 X165 Z4
N260 G1 Z0.05 F0.5 T2 M8
N270 G15 X168.5 K0.7 F0.16
N280 G1 Z-21
N290 G1 X175 F0.5 T3 M9
N300 G0 X450 Z50
N310 T4373 M4
N320 G96 S160 M38
N330 G0 X175 Z2
N340 G1 X77 F2
N350 G1 Z-1 F0.16 M8
N360 G1 X20
N370 G1 Z1 M9
N380 G0 X200
N390 G0 X420 Z50
N400 T5073 M4
N410 G96 D400 S160 M38
N420 G0 X175 Z-15
N430 G1 X170.2 F0.2 T2 M8
N440 G15 Z-18 K0.6
N450 G15 X70 K8
N460 G1 Z-32 T3 M9
N470 G0 X200
N480 G0 X390 Z100
N490 M5
N500 M58
N510 M30


Weißt du da weiter? Bin heut schon wieder den ganzen Tag dabei das hinzubekommen, aber es will einfach nciht !
Member: Friemler
Friemler Oct 11, 2011 at 15:56:32 (UTC)
Goto Top
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.

'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
Member: lordofremixes
lordofremixes Oct 12, 2011 at 06:17:41 (UTC)
Goto Top
Hallo Friemler,

den Taskplaner habe ich umgestellt auf zwei Minuten.

Wieso das mit der Änderung nicht mehr geklappt hat, lag daran:
Wieso auch immer war bei sehr , sehr vielen Programmen das Archivbit gesetzt. Habe mit attrib /-a das Archivbit aller Dateien gelöscht,
dann eine fehlerhafte DNC Datein in den Ordner rein geschrieben und es ging sofort wieder.. Auch das mit dem Überschreiben einer gleichen Datei klappt einwandfrei (der cnc User hatte keinen Vollzugriff auf den Ordner).

Wegen deinem neuen Script: In deinem neuen Script muss irgendwo der Wurm drin sein, habe es eingefügt und es tut sich nichts mehr...Habe jetzt sicherheitshalber wieder das alte eingefügt.

2. (was noch viel wichtiger ist)
Ich habe noch einen gravierenden Fehler entdeckt. Ich versuche es dir mit einem Beispiel zu erklären:

Und zwar läuft ja jetzt alles gut, aber bei Programmen in denen der Artikel nicht in Klammern dabei steht, ändert das Script auch nichts.

Folgende Datei kommt an:
$$ (9999990)
%PM
N3859961 (SIEBKORB)
N5 M59
N10 G54

Das Script ändert die Datei nach 2 Minuten ab in

$$ (9999990)
%PM
N9999990 (SIEBKORB)
N5 M59
N10 G54
So wie es sein sollte.


Kommt aber folgende Datei an:

$$ (8888888)
%PM
N3974533 (HIER IM UNTERSCHIED ZUR ANDEREN DATEI FEHLT DIE KLAMMER MIT DER ARTIKELBESCHREIBUNG)
N10 G54

Wird dann nichts geändert und nachdem das Script durchgeloffen ist, sieht die Datei dann immer noch so aus.

$$ (8888888)
%PM
N3974533
N10 G54
...


Es gibt halt einige Programme in denen nichts in der Klammer steht, die Arbeiter speichern sie dann unter einer neuen Nummer und wenn sie es wieder laden, haben sie wieder das alte falsche Programm.

Weißt du wieso das so ist und gibt es da eine Lösung für?

Gruß und danke für die Mühe
lordofremixes
Member: Friemler
Friemler Oct 12, 2011 at 15:31:40 (UTC)
Goto Top
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:
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
Member: lordofremixes
lordofremixes Oct 13, 2011 at 08:12:49 (UTC)
Goto Top
Hallo Friemler,

danke für die guten Erklärungen.

Das Script läuft jetzt durch, nachdem ich es kopiert habe. Musste ja nicht einmal mehr die 2 Zeilen mit den Pfaden anpassen, weil sie genau so richtig waren.
Und es läuft richtig gut!!! Das Script benötigt ca. 13 sekunden, eine wirklich sehr gute Zeit!

Nachdem ich von objRegExp.Pattern = "(N)([0-9]*)( .*)" in objRegExp.Pattern = "(N)([0-9]*)(.*)" geändert habe, funktioniert sogar alles bei DNC Dateien ohne Artikel in Klammern, genauso wie du beschrieben hast.

Glaube nicht. dass jetzt noch irgendwas falsch sein kann bzw. nicht funktioert.

Fetten DANK!!!
lordofremixes
Member: Friemler
Friemler Oct 13, 2011 at 14:53:02 (UTC)
Goto Top
Hallo lordofremixes,

Zitat von @lordofremixes:
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
Member: lordofremixes
lordofremixes Jan 31, 2023 at 12:08:31 (UTC)
Goto Top
Heilger Bimbam, war das eine heftige Unterstützung face-smile
War damals mein erster Beitrag....
Halleluja und danke nochmal face-smile