Avatar billede majsmarken Nybegynder
25. januar 2004 - 22:40 Der er 17 kommentarer og
1 løsning

Automatisk med Z interval copy fil fra X til Y + skriv i logfil

Jeg er indblandet i en system hvor der nogle gange bliver "smidt" en (grafik)fil på et sted som brugerne normalt ikke har adgang til.

I VBS 'freaks' er jo så dygtige og vil elske en sådan opgave:

Jeg ønsker et script som med [Time] sek. mellemrum checker om der er nogle NYE filer som er større end 0 på [source]. Så copy den/dem til [Dest] og noter reslutat i [Log]fil.

[Time],[Source],[Dest],[Log] skal være i kommandolinien eks.

SYNC.VBS 10 \\server1\input \\server2\out \\server2\out\log.txt

eller

SYNC.VBS 10 c:\input X:\out d:\log.txt

Programmet skal køre rundt i en loop hele tiden på en Windows server der kan 'se' det hele. Den server bruges iøvrigt også til andre automatiske processer...

Evt. udbygning: Hvis der også kunne bestemmes hvilke typer filer der skal kikkes efter - i dette tilfælde *.JPG *.BMP *.TIF ?

Der findes måske et program iforvejen et eller andet sted ude i verden ?
Avatar billede bfjmnemonic Nybegynder
06. februar 2004 - 15:34 #1
Jeg har flækket lidt sammen, mon ikke det kan bruges.

Option Explicit

Dim WshShell, oFS, Source, Destination, oCatalog, file, oFiles, LogFile, SleepTimer
Set WshShell = CreateObject("WScript.Shell")
Set oFS = CreateObject("Scripting.FileSystemObject")

Const ForReading = 1, ForWriting = 2, ForAppending = 8

If WScript.Arguments.Count < 3 Then
    WScript.Echo "Error in command. For Right use, type:" & vbCrLf _
    & "CScript SpotAndCopy.vbs [TIME] [Source] [Destination] [LogFile]" & vbCrLF & vbCrLf _
    & "EX:" & vbCrLf & "CScript SpotAndCopy.vbs 10 C:\Source C:\Destination C:\logfile.txt"
    WScript.Echo SleepTimer
    WScript.Quit
End If

SleepTimer = WScript.Arguments(0)    'Time in Seconds
SleepTimer = SleepTimer * 1000
Source = WScript.Arguments(1)         '"c:\temp\Source"
Destination = WScript.Arguments(2)    '"c:\temp\Destination"
LogFile = WScript.Arguments(3)        'Source & "\LogFile.log"

Set oCatalog = oFS.GetFolder(Source)
Set oFiles = oCatalog.Files
Set LogFile = oFS.OpenTextFile(LogFile, ForAppending, True)


Do
    For Each file In oFiles
        If file.Size > 0 Then
            Copy(file)
        End If
    Next
    WScript.Sleep SleepTimer
Loop


WshShell = "Nothing"
oFS = "Nothing"
LogFile.Close
LogFile = "Nothing"


'---------------------------------------------------------------------
Function Copy(file)

    Dim DestinationFile
   
    DestinationFile = Right(file, (Len(file)-InStrRev(file, "\", -1, vbTextCompare)))

    If Not oFS.FileExists(Destination & "\" & DestinationFile) Then
        oFS.CopyFile file, Destination & "\" & DestinationFile, True
        If Err.Number = 0 Then
            Log(DestinationFile & " Has been copied.")
        Else
            Log("Copy og file " & file & " has failed with the following message: " & Err.Description)
        End If
        Err.Clear
    End If
   
End Function
'---------------------------------------------------------------------
Function Log(Msg)

    LogFile.WriteLine Time & " " & Date & " " & Msg

End Function
'---------------------------------------------------------------------
Avatar billede majsmarken Nybegynder
09. februar 2004 - 20:26 #2
Godt "flækket lidt sammen" - det virker faktisk som hensigten...
Er instaleret og ruller - men:

Systemet/bruger opretter en fil [Peter.jpg] på [Source] og så bliver den jo straks copy til [Dest] som ønsket - godt nok.
Lidt efter opretter Systemet/bruger en anden fil med andet indhold men også kaldet for [Peter.jpg] (Systemet/bruger kan IKKE checke for om der findes en fil allerede med samme navn) så vil SpotAndCopy programmet jo ikke copy til [Dest] da der allerede findes en fil [Peter.jpg] ved [Dest].

Ka' det have sig rigtighed ?
Det vil være i meget få tilfælde - men bare for at være garderet da der efterhånden kommer flere brugerer på - pt. 300 mulige brugerer...

Måske en mulighed for at checke på en form for TimeStamp mellem [Source]/[Dest] i samarbejde med [Len] ???

Hmmm...
Avatar billede bfjmnemonic Nybegynder
09. februar 2004 - 21:33 #3
Det havde du jo ikke snakket noget om, men mon ikke den skulle være der der.

Option Explicit

Dim WshShell, oFS, Source, Destination, oCatalog, file, oFiles, LogFile, SleepTimer
Set WshShell = CreateObject("WScript.Shell")
Set oFS = CreateObject("Scripting.FileSystemObject")

Const ForReading = 1, ForWriting = 2, ForAppending = 8

If WScript.Arguments.Count < 3 Then
    WScript.Echo "Error in command. For Right use, type:" & vbCrLf _
    & "CScript SpotAndCopy.vbs [TIME] [Source] [Destination] [LogFile]" & vbCrLF & vbCrLf _
    & "EX:" & vbCrLf & "CScript SpotAndCopy.vbs 10 C:\Source C:\Destination C:\logfile.txt"
    WScript.Echo SleepTimer
    WScript.Quit
End If

SleepTimer = WScript.Arguments(0)    'Time in Seconds
SleepTimer = SleepTimer * 1000
Source = WScript.Arguments(1)        '"c:\temp\Source"
Destination = WScript.Arguments(2)    '"c:\temp\Destination"
LogFile = WScript.Arguments(3)        'Source & "\LogFile.log"

Set oCatalog = oFS.GetFolder(Source)
Set oFiles = oCatalog.Files
Set LogFile = oFS.OpenTextFile(LogFile, ForAppending, True)


Do
    For Each file In oFiles
        If file.Size > 0 Then
            Copy(file)
        End If
    Next
    WScript.Sleep SleepTimer
Loop


WshShell = "Nothing"
oFS = "Nothing"
LogFile.Close
LogFile = "Nothing"


'---------------------------------------------------------------------
Function Copy(file)

    Dim DestinationFile, DF
 
    DestinationFile = Right(file, (Len(file)-InStrRev(file, "\", -1, vbTextCompare)))

    If Not oFS.FileExists(Destination & "\" & DestinationFile) Then
        oFS.CopyFile file, Destination & "\" & DestinationFile, True
        If Err.Number = 0 Then
            Log(DestinationFile & " Has been copied.")
        Else
            Log("Copy og file " & file & " has failed with the following message: " & Err.Description)
        End If
        Err.Clear
    Else
        Set DF = oFS.GetFile(Destination & "\" & DestinationFile)
        If file.DateLastModified <> DF.DateLastModified Then
            oFS.CopyFile file, Destination & "\" & DestinationFile, True
            If Err.Number = 0 Then
                Log(DestinationFile & " Has been copied.")
            Else
                Log("Copy og file " & file & " has failed with the following message: " & Err.Description)
            End If
            Err.Clear
        End if
    End If
 
End Function
'---------------------------------------------------------------------
Function Log(Msg)

    LogFile.WriteLine Time & " " & Date & " " & Msg

End Function
'---------------------------------------------------------------------
Avatar billede majsmarken Nybegynder
09. februar 2004 - 21:55 #4
Det jeg ka' tyde ser rigtigt ud...
Har dog først mulighed for at checke i real life i løbet af Onsdag (11/02 2004).

Sødt navn med: [SpotAndCopy] ...

Vender tilbage...
Avatar billede bfjmnemonic Nybegynder
11. februar 2004 - 08:40 #5
Det er fint fint .. Ja navnet kom lige til mig :)
Avatar billede majsmarken Nybegynder
19. februar 2004 - 23:50 #6
Det virker som ønsket...

Part #1
Men jeg/vi har et ønske om at kunne "se" om programmet ruller som det skal.
I nuværende version sker der jo "ingenting" på skærmen når programmer ruller og man kan så blive i tvivl om hvorvidt det er igang...

I loopen hvor der ventes (i nævnte eksempel 10 sek) skal der på skærmen vises et [.] for hver sekund samt [O] for hvert check.
Samt evt. hvilke filer der bliver copy (hvis nogen) på samme måde som i logfilen.

Eks:

SpotAndCopy running:
From
    [Source]
To
    [Destination]
every X second

..........O..........O..........O
Peter.jpg has been copied
..........O..........O..........O..........O..........O..........O..........O..........O..........O..........O..........O..........O
Pia25.jpg has been copied
Monitor.jpg has been copied
..........O..........

osv...

Evt. kan denne skærminfo undertrykkes med en [/s] flag på i argument linien(s=silent/stille) hvis nogen vil det...

Part #2
Det virker som om logfilen blive helt låst for manuelt editering når programmet ruller ? Hvis du kunne arrangere at den bliver "åbnet" / ikke-låst når ønsket info er skrevet i den ? Det var for at kunne slette en del i den uden at skulle kvæle programmet først...

På nuværende tidspunkt har programet kørt i >1 uge og har copy 1765 filer OK !!!
Iøvrigt er selve programmet på server1; eksekveres via server2; copy fra server3 til server4; logfil skrives på server5 - jo det virker...
Avatar billede majsmarken Nybegynder
19. februar 2004 - 23:58 #7
Monty Pyton havde engang en sketch ved navn: "Spot The Looney" samt en slags PC spil baseret på samme - har det et eller andet ted i arkivet. Jeg kommer til at tænke på den mht. navnet: [SpotAndCopy] ...
Ja - jeg er fra "den tid" ...
Avatar billede majsmarken Nybegynder
25. februar 2004 - 05:29 #8
En "detalje": Hvis Source eller Target ikke er tilgængeligt - i mit tilfælde er det ved en server - så går programmet i stå ?
Kan du få det til at på en eller anden måde checke om Source eller Target er tilgængelig uden at "dø" ?
Avatar billede bfjmnemonic Nybegynder
25. februar 2004 - 22:34 #9
Ja det kan jeg godt lave til dig, men jeg begynder at tvivle lidt på om jeg nogen sinde ser noget til de der points....
Avatar billede majsmarken Nybegynder
26. februar 2004 - 03:19 #10
... hvor (i denne version af eksperten) ændrer (=forøger) man POINT ?
Så jeg ka' skyde X point af til dig <bfjmnemonic>...
Avatar billede majsmarken Nybegynder
03. marts 2004 - 08:30 #11
<bfjmnemonic> - Se i http://www.eksperten.dk/spm/472438
Avatar billede majsmarken Nybegynder
10. marts 2004 - 04:51 #12
<bfjmnemonic>: Her er første 'bidrag' / 'afdrag' mht POINT
Avatar billede bfjmnemonic Nybegynder
14. marts 2004 - 12:19 #13
Fint Fint takker. Jeg kigger lige på det snarrest.
Avatar billede majsmarken Nybegynder
17. maj 2004 - 07:47 #14
<bfjmnemonic>: Øhhh ... What's Up ?

"En "detalje": Hvis Source eller Target ikke er tilgængeligt - i mit tilfælde er det ved en server - så går programmet i stå ?
Kan du få det til at på en eller anden måde checke om Source eller Target er tilgængelig undervejs uden at programmet "dør" ? Og så prøve igen efter lidt tid...

Programmet har kørt fint - ~5000 automatiske copy operationer er gennemført pt.
Avatar billede bfjmnemonic Nybegynder
23. maj 2004 - 13:18 #15
Problemet opstår hvis det f.eks. er et netværks share der er mappet, og den så af en eller anden grund ikke er tilgængelig? Eller er det et andet senario?
Avatar billede bfjmnemonic Nybegynder
23. maj 2004 - 13:20 #16
Hvad vil du have den til i tilfælde af fejl?
Avatar billede majsmarken Nybegynder
22. juni 2004 - 12:04 #17
... Hmmm... jeg har ikke fået noget mail om nye indlæg i denne tråd - ser det først nu...

"i tilfælde af fejl" - skip forsøg på copy processen og kør videre i loopen (pt. bruger jeg 15 sek. interval).

Dette skal gælde både for Source eller Target stedet...
Avatar billede majsmarken Nybegynder
14. september 2004 - 13:20 #18
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester