ageers
Goto Top

Loginscript Feststellen wann eine Routine das letzte Mal gelaufen ist

Hallo Zusammen!

brauche eure Hilfe stehe echt auf dem Schlappen...

DANKE IM VORRAUS!

Also Situation:


WIr haben ein Verzeichnis das ca. 50000 Datein (~2,5 GB) dieses Verzeichnis enthält Firmenkonfigurationen für ein CAD Programm.

Diese Daten sollen für alle Anwender des Programms gleich sein.

Damit wir uns nicht unseren Fileserver künstlich in die Knie zwingen, soll dieses Verzeichnis lokal auf den Rechnern (ca. 80 Betroffene Rechner)
liegen, auf denen das Programm installiert ist.

Also wir wollen das dieses Lokales Verzeichnis auf dem Rechner mit einem Verzeichnis auf dem Server abgeglichen wird. (per Logonscript)

Systeme: Windows 2003 SP2 , Windows XP SP3


Problem:

Da dieses abgleichen in etwa 120 Sekunden in Anspruch nimmt und auch nur sporadisch Daten geändert werden,

würde es reichen wenn dieser Abgleich einmal die Woche läuft.

Also der Abgleich funktioniert soweit, nur das mit dem einmal die Woche, habe ich null plan wie ich das bewerkstelligen soll...?

Hat da jemand eine Idee?


Hatte ich schon danke im vorraus gesagt?

Ageers

Content-Key: 107518

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

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

Member: matsahm
matsahm Jan 29, 2009 at 12:51:52 (UTC)
Goto Top
Per Batch, VBS, Kix, oder was setzt du ein?

MfG: Mathias Sahm
Member: bastla
bastla Jan 29, 2009 at 13:03:50 (UTC)
Goto Top
Hallo aGeers!

Per Batch etwa so (vor Deinem bisherigen Script platzieren):
@echo off & setlocal
set G=%temp%\GetWeekDay.vbs
>>%G% echo WScript.Echo WeekDayName(WeekDay(WScript.Arguments(0)),True)
for /f %%i in ('cscript //nologo %G% %date%') do set "WTag=%%i"  
if /i "%WTag%" neq "Do" goto :eof  
echo Synchronisation wird vorgenommen ...
Grüße
bastla
Mitglied: 60730
60730 Jan 29, 2009 at 13:05:32 (UTC)
Goto Top
Servus,

so als Denkansatz - auch wenn es mit deiner Frage nicht so richtig zusammenhängt (2.5 GB in 120 sek.)
Sind die Dateien bereits gezippt? - Wahrscheinlich ja.

Kennst du Robocopy /?

Ich bezweifele - aber mangels Wissen ist das auch nur in den Raum geworfen - dass die Zeile wirklich stimmt:

würde es reichen wenn dieser Abgleich einmal die Woche läuft.

An deiner Stelle - oder besser - bei uns - werden solche "Konfig" Jobs nachts erledigt - wobei 120 sek. ja auch nicht die Welt sind.
Sprich WOL - robocopy und shutdown.

Gib mal Feedback, ob das bei euch so passen könnte und ob obige Zeilen stimmen.

Mit den nur alle x tage wär ich vorsichtig, "irgendeinen" Grund und Sinn müssen die Änderungen ja haben und dann arbeitet jemand x Tage mit einem alten Stand - whatever - wär mir zu heikel.

Gruß


edit @ Bastla:
"So" ähnlich hatte ich das mal vor ein paar Jahren und irgendwann ist bei uns rausgekommen, dass Kollegin x - Freitags nie da war..
/edit
Member: aGeers
aGeers Jan 29, 2009 at 15:15:30 (UTC)
Goto Top
Also

Die Synchronization nur an einem bestimmten Tage wird aus dem genannten Grund nicht
funktionieren.

Batch kenntnisse würde ich durchschnittlich bezeichnen also setzt nicht zuviel Vorraus....

Robocopy kenne ich und darüber läuft das auch...
Gezippt sind Sie nicht, da die Erstsync bei der Installation abläuft nach halber Turnschuh methode und
Änderungen danach zu klein sind um ständig zippen und entzippen => ABM

Alle X Tage Abgleich passt schon, da die User auch eine Verknüpfung zur Manuellen Synchronisation
bekommen sollen.

Das ganze ist schon soweit fertig, nur die Abfrage ob der Sync länger als 7 Tage her ist habe ich keinen
plan, wie das funktionieren soll..

Hatte schon gedacht, ob man nach dem Sync eine Datei erstellt und dann per Script das Dateidatum abfragt
und dann das umrechnet. Aber da sind wir wieder bei Punkt 1, null Plan...

mfg
Ageers
Member: aGeers
aGeers Jan 29, 2009 at 15:34:18 (UTC)
Goto Top
ALso ich hab unter faq-o-matic.net was gefunden:


Zitat:
Option Explicit
Dim intZahl      '   
Dim strExtension      '   
Dim intTage           '   
Dim objDatei          '   
Dim objFSO            '   
Dim objOrdner         '   
Dim strOrdner         '   
 
Set objFSO = CreateObject("Scripting.FileSystemObject")  
strOrdner = "D:\Temp\Dateien"  
strExtension = "bak"  
intTage = 30
 
Set objOrdner = objFSO.GetFolder(strOrdner)
intZahl = 0
For Each objDatei In objOrdner.Files
    If LCase(Right(objDatei.name, Len(strExtension))) = LCase(strExtension) _ 
        And DateDiff("d", objDatei.DateLastModified, Now) > intTage Then  
        objDatei.Delete
        intZahl = intZahl + 1
    End If
Next
 
WScript.Echo intZahl & " Dateien gelöscht."  
Wenn das man jetzt so umschreiben könnte das er nur eine bestimmte Datei überprüft
und die dann löscht, würde das vielleicht schon funktionieren....
Ich habe nur leider keine Ahnung davon...

DANKE!

Mfg
Ageers
Member: bastla
bastla Jan 29, 2009 at 16:02:07 (UTC)
Goto Top
Hallo aGeers!

Ich würde den umgekehrten Weg vorschlagen: Eine Datei bei jeder Synchronisation als "Timestamp" erstellen und deren Alter mit einem Mindestalter vergleichen - etwa so:
@echo off & setlocal
set "Timestamp=D:\Timestamp.txt"  
set /a MinAlter=7

if not exist "%timestamp%" goto :DoIt   
set C=%temp%\CheckOld.vbs
>%C% echo WScript.Echo Datediff("d",CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified, Date)  

for /f %%i in ('cscript //nologo %C% "%Timestamp%"') do set /a Alter=%%i  
if %Alter% lss %MinAlter% goto :eof

:DoIt
>"%Timestamp%" echo %date%  
echo Synchronisation wird vorgenommen ...
Grüße
bastla
Mitglied: 60730
60730 Jan 29, 2009 at 16:53:31 (UTC)
Goto Top
Servus,

Robocopy kenne ich und darüber läuft das auch...
dann bitte mal dein Skript hier zwischen < Code> und < /code> (Ohne das Leerzeichen hinter <) einstellen.

Gezippt sind Sie nicht, da die Erstsync bei der Installation abläuft nach halber Turnschuh methode und
Änderungen danach zu klein sind um ständig zippen und entzippen => ABM

Halbe Turnschuhmethoden werden hier strikt abgelehnt nud auch keine Tipps dafür gegeben face-wink
Vollautomatisches zippen ist wirklich nicht das Thema.

Bastla hat (wie immer - wie üblich) eine gute Umsetzung - nur frage ich mich wirklich, ob es sich wirklich rentiert x Tage zu warten und damit natürlich viel mehr Änderungen zu synchronisieren, als nötig.
Ergo ist tägliches abgeleichen im Endeffekt schneller.

Und nur um einen etwas anderen Ansatz anzusprechen:
Grundsätzlich bin ich ein Fan von "Dokumentation" - gerade wenn es .ini Files sind.
Steht diese "Dokumentation" auf dem Server unter Freigabe und jeder, der etwas ändert schreibt rein was und wann - kann die auch ausgelesen und verarbeitet werden"

fc \\server\freigabe\version.ini %programfiles%\meincadtool\version.ini && goto end
echo Aenderungen gefunden
robocopy ....
:end
echo nix zu tun

Gruß
Member: aGeers
aGeers Jan 29, 2009 at 17:35:49 (UTC)
Goto Top
@ TimoBeil > ganz weit unten
@bastla
Danke!
so hatte ich mir das gedacht....

Aber da ich auch wissen will, was ich tue und nicht einfach Paste and Copy zerpflücke ich das mal:

01.@echo off & setlocal
Soweit klar Echo abschalten und Aktuelles Ausführ Verzeichnis auf Lokal stellen

02.set \"Timestamp=D:\\Timestamp.txt\"
Auch klar Variable Timestamp auf D:\\timestamp.txt stellen

03.set /a MinAlter=7
=>halbwegs kapiert setze die Variable MinAlter auf 7
=>Nur warum set /a und nicht Set?
=>Wo ist der Unterschied? Hilfe sagt /a = ausdruck aha das hat geholfen face-sad

04.
05.if not exist \"%timestamp%\" goto :DoIt
=>Klar Existiert die Datei Timestamp.txt nicht lege los

06.set C=%temp%\\CheckOld.vbs
=> Setze Varibale C auf das Temp Verzeichnis und auf die Checkold.vbs

07.>%C% echo WScript.Echo Datediff(\"d\",CreateObject(\"Scripting.FileSystemObject\").GetFile(WScript.Arguments(0)).DateLastModified, Date)
=> Jetzt gehst los:
.>%C% echo
Ausgabe in Datei %temp%\\checkold.vbs umleiten
WScript.Echo Datediff
WIndows Scripting Funktione Datumdifferenz ahnlich Access
(\"d\",CreateObject(\"Scripting.FileSystemObject\").GetFile(WScript.Arguments(0)).DateLastModified, Date)
\"d\" Vermutlich Days für Tage
,Createobjekt(\"Scripting.FilesystemObject\")
Funktion zum erstellen der checkold.vbs
.GetFile(WScript.Arguments(0)).DateLastModified, Date)
Funktion die in der checkold.vbs enthalten sein soll, punkt als fortführendes
Zeichen das dort nicht schluss ist
(WScript.Arguments(0)).
Kein Plan Wieso null?
.DateLastModified, Date)
Windows Scripting Funktion die enthalten sein soll
08.
09.for /f %%i in (\'cscript //nologo %C% %Timestamp%\') do set /a Alter=%%i
For if Operation mittels cscript Ohne Meldung
Führe checkold.vbs aus
Hole das Änderungsdatum aus der Datei Timestamp.txt und setzte die Variable Alter auf das
Änderungsdatum, wieso set /A ?

10.if %Alter% lss %MinAlter% goto :eof
Vergleiche die Varibale Alter mit der Varibale MinAlter
Die funktion Iss Kennt die windows hilfe nicht, google schon..
Also die vergleichsfunktion

11.
12.:DoIt
13.>\"%timestamp%\" echo %date%
Ausgabe des aktuellen Datums in die Datei angegeben in der Variable Timestamp

14.echo Synchronisation wird vorgenommen ...
Habe ich das soweit kapiert?

@timobeil
Hab ich da Ehrgeiz geweckt?
Bin für jede Verbessung zu haben!

Die Synchronsation läuft folgendermaßen ab.
Die jede Abteilung erhält ein Cad Admin Windows Profil
Mit diesem Profil kann Sie Änderungen vornehmen und am Ende die Änderungen auf den Server syncen
Das mit der Doku teste ich.
Aber da ich für den Inhalt nicht verantwortlich bin, ist mir eine Auto lieber, aber trotzdem werde ich es testen
Danach über Logonscript oder manuell auf die PC´s

REM *****************************************************************************************************************************
:ADT2009USERSYNC
IF %ADT2009USERSYNC% == 0 goto Next
ECHO ADT2009USERSYNC AKTIV


if not exist "C:\Programme\ACD-A2009\ACAD.EXE" goto next  
if not exist "C:\ADTDATEN\" goto next  

Hier Abfrage ob Timestamp Datei  aelter ist

IF EXIST C:\Programme\ACD-A2009\timestamp.TXT goto next

"%TEMP%\LOGON\ROBOCOPY.exe" "\\Servername\Cad\Programme\ADT2009\ADTDATEN" "c:\adtdaten" /r:1 /w:1 /S /Z /LOG:C:\Programme\ACD-A2009\ADTDATEN.log  

CALL "%TEMP%\LOGON\CPAU.exe -file \\domaenenname\sysvol\Domaenenname\scripts\parts\CPAU\ADT2009ordner.txt -dec -profile /WAIT  

ECHO INFORMATIONSDATEI FUER DAS ERMITTELN DES LETZTEN SYNC`S!>C:\Programme\ACD-A2009\timestamp.TXT
ECHO NIEMALS LOESCHEN!!!>>C:\Programme\ACD-A2009\timestamp.TXT

:next


Der Cpau Teil:
CALL "%TEMP%\LOGON\CPAU.exe -file \\domaenenname\sysvol\Domaenenname\scripts\parts\CPAU\ADT2009ordner.txt -dec -profile /WAIT

Cpau führt unter Administrator konto eine Batch mit folgende Inhalt aus.
Das muss gemacht werden, obwohl entsprechende Berechtigung auf dem Serververzeichnis gesetzt sind.
Chef: machen ich:is schon Chef: Trotzdem

cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_ELT\ELT_Katalog /i copy /q
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_ELT\ELT_Katalog /g BUILTIN\administrators:F /g BUILTIN\SYSTEM:F /g BUILTIN\EVERYONE:R /g agnibb\CADADM:F /g agnibb\Cadverwalter:F
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT__Shared\ABT_Content\Katalog /i copy /q
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT__Shared\ABT_Content\Katalog /g BUILTIN\administrators:F /g BUILTIN\SYSTEM:F /g BUILTIN\EVERYONE:R /g Domaene\CADADM:F /g Domaene\Cadverwalter:F
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_HLS\HLS_Katalog /i copy /q
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_HLS\HLS_Katalog /g BUILTIN\administrators:F /g BUILTIN\SYSTEM:F /g BUILTIN\EVERYONE:R /g Domaene\CADADM:F /g Domaene\Cadverwalter:F
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_PLG\PLG_Katalog /i copy /q
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_PLG\PLG_Katalog /g BUILTIN\administrators:F /g BUILTIN\SYSTEM:F /g BUILTIN\EVERYONE:R /g Domaene\CADADM:F /g Domaene\Cadverwalter:F
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_GaLa\GaLa_Katalog /i copy /q
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_GaLa\GaLa_Katalog /g BUILTIN\administrators:F /g BUILTIN\SYSTEM:F /g BUILTIN\EVERYONE:R /g Domaene\CADADM:F /g Domaene\Cadverwalter:F
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_WB\WB_Katalog /i copy /q
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\ABT_WB\WB_Katalog /g BUILTIN\administrators:F /g BUILTIN\SYSTEM:F /g BUILTIN\EVERYONE:R /g Domaene\CADADM:F /g Domaene\Cadverwalter:F
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\Bauherren\BLB\BLB_Katalog /i copy /q
cscript.exe S:\Programme\ADT2009\CMD\xcacls.vbs C:\ADTDATEN\Bauherren\BLB\BLB_Katalog /g BUILTIN\administrators:F /g BUILTIN\SYSTEM:F /g BUILTIN\EVERYONE:R /g Domaene\CADADM:F /g Domaene\Cadverwalter:F

Dieses setzen der Berechtigungen ist es was das in die Länge zieht.

DANKE!
Ageers
Mitglied: 60730
60730 Jan 29, 2009 at 17:43:46 (UTC)
Goto Top
Servus,

  • Schau dir bitte und editiere deinen Beitrag, das ist besser zu lesen.
  • Besorg dir vom W2k3 Server das reskit und benutze das Xcalcs als exe nicht die .vbs Geschichte.
Und dann schau ich mir das (morgen) nochmal an, hab jetzt Schicht im Schacht. (Mir fallen die Augen zu, war ne kurze Nacht und ein langer Tag)

Gruß
Member: bastla
bastla Jan 29, 2009 at 18:00:15 (UTC)
Goto Top
Hallo aGeers!
Habe ich das soweit kapiert?
Grundsätzlich: ja - ein paar Kleinigkeiten beschreibe ich kurz noch etwas genauer:
01.@echo off & setlocal
Soweit klar Echo abschalten und Aktuelles Ausführ Verzeichnis auf Lokal stellen
"setlocal" bezieht sich auf Variablen und sorgt dafür, dass Änderungen an bestehenden Variablen bzw neu erstellte Variable nur für diesen Batch (bzw bis zum nächsten "endlocal") gelten sollen - so bleiben keine unerwünschten "Reste" ...
03.set /a MinAlter=7
Das "/a" müsste tatsächlich nicht sein - soll nur zeigen, dass %MinAlter% eine numerische Variable ist.
06.set C=%temp%\\CheckOld.vbs
=> Setze Varibale C auf das Temp Verzeichnis und auf die Checkold.vbs
In der Datei "CheckOld" im Temp-Verzeichnis des aktuellen Users wird gleich nachher durch ein einfaches "echo" mit Umleitung in diese Datei ein kleines VBScript erstellt ...
07.>%C% echo WScript.Echo Datediff(\"d\",CreateObject(\"Scripting.FileSystemObject\").GetFile(WScript.Arguments(0)).DateLastModified, Date)
... da isses schon: face-wink
WScript.Echo Datediff("d", CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0)).DateLastModified, Date)
Dieses Script übernimmt eine Datei als Parameter (VBS nummeriert ab 0, daher "WScript..Arguments(0)"), holt deren Änderungsdatum und vergleicht es mit dem aktuellen Datum ("Date"), wobei die Differenz, wie richtig erkannt, in Tagen berechnet und schließlich ausgegeben ("WScript.Echo") wird - so kann es der Batch dann übernehmen.

Die Punkte dienen nicht dem Fortsetzen der Zeile (das wäre in VBS "_"), sondern trennen Objekte, Methoden, Eigenschaften (ersparen allerdings tatsächlich einige Zeilen, da keine Zwischenvariablen erstellt werden müssen) ...
Info zu "lss" findest Du auch in der Online-Hilfe ("if /?")

Grüße
bastla
Member: aGeers
aGeers Jan 29, 2009 at 19:37:49 (UTC)
Goto Top
@ Bastla
Daumen hoch

Auf Administrator.de ist wieder einmal Verlass...

Echt Geil...


@timobeil
Danke!
Und gute Nacht...

Kann man eigentlich Grüne Daumen oder Punkte hier verteilen?
Hier sind echt hilfsbereite und fitte Leute am Werk....


Grüße
Ageers
Mitglied: 60730
60730 Jan 30, 2009 at 08:47:22 (UTC)
Goto Top
Zitat von @aGeers:
@ TimoBeil > ganz weit unten

Hab ich da Ehrgeiz geweckt?

Moin,
*grübel*
  • ich bin Ehrlich aber nichtGeizig face-wink
Geweckt? Naja - ich hab früher, als unsere WaWi noch nicht auf Citrix lief täglich 1-2 GB zum Client "schaufeln" dürfen, da findet man so einiges Optimierungspotentialface-wink
Bin für jede Verbessung zu haben!

Dann mal ein Tipp, um das potential zu entdecken:
REM
echo Start >>c:\log.txt
echo %time% >>c:\log.txt
:ADT2009USERSYNC
IF %ADT2009USERSYNC% == 0 goto Next
ECHO ADT2009USERSYNC AKTIV


if not exist "C:\Programme\ACD-A2009\ACAD.EXE" goto next  
if not exist "C:\ADTDATEN\" goto next  
 
IF EXIST C:\Programme\ACD-A2009\timestamp.TXT goto next
 
"%TEMP%\LOGON\ROBOCOPY.exe"  "\\Servername\Cad\Programme\ADT2009\ADTDATEN" "c:\adtdaten" /r:1 /w:1 /S /Z  /LOG:C:\Programme\ACD-A2009\ADTDATEN.log  
echo kopieren beendet >>c:\log.txt
echo %time% >>c:\log.txt
 
CALL "%TEMP%\LOGON\CPAU.exe -file \\domaenenname\sysvol\Domaenenname\scripts\parts\CPAU\ADT2009ordner.txt -dec -profile /WAIT  
 
ECHO INFORMATIONSDATEI FUER DAS ERMITTELN DES LETZTEN
SYNC`S!>C:\Programme\ACD-A2009\timestamp.TXT
ECHO NIEMALS LOESCHEN!!!>>C:\Programme\ACD-A2009\timestamp.TXT
 
:next
echo Rechte setzen beendet>>c:\log.txt
echo %time% >>c:\log.txt
/snip

Das muss gemacht werden, obwohl entsprechende Berechtigung auf dem Serververzeichnis gesetzt sind.
Chef: machen ich:is schon Chef: Trotzdem>
? Wenn deine Aussage stimmt - dazu ja das setzen der "Zeitstempel" c:\log.txt
Ist das xcacls der Timewaster - und der (xcacls Teil) ist eigentlich unnötig - zumindestens als dauerläufer.

Hast du mittlerweile das xcacls?
Da bei uns jede W2k3 CD "manipuliert" ist *lach* - nein das nennt man ja richtigerweise optimiert/Slipstreamed ist - weiß ich ehrlich grad nicht, ob die im Reskit oder schon dabei ist.

Du setzt in dem Teil da unten - Rechte - die eigentlich eh vorhanden sind - in meinen Augen ist das flüssiger als flüssig, überflüssig face-wink

Das kannst du aber auch mit xcalcs herausfinden - einfach mal einen Dump der Rechte vor dem kopieren und danach - und du wirst keine Unterschiede finden.
Und wenn der xcaclss Teil der "lahme" ist - dann kannst du das kopieren ja auch wieder täglich machen.


DANKE!
Da nicht für, bzw. danke fürs Danke
Ageers
T-MO