08. april 2005 - 10:46Der er
50 kommentarer og 1 løsning
Kopiere filer til ftp hvert 20 minut !
Kan man lave et lille VB program der automatisk uploader filer og undermapper fra en mappe til FTP når der findes en internet forbindelse (Den må ikke melde fejl hvis computeren ikke er online)
Den skal kun kopiere de filer der er ændret hvis de allerede findes på serveren
Jeg har denne kode der bare skal laves en timer på ligesom den af din, og så tilføjes noget ftp... det må da kunne lade sig gøre ???
option explicit dim targetFolder,sourceFolder
sub log(msg) 'msgBox msg end sub
function Chk(sourceFolder,targetFolder) chk=true if not objFSO.FolderExists(sourceFolder) then MsgBox("Kan ikke åbne kilde : "&sourceFolder) chk=false end if
if not objFSO.FolderExists(targetFolder) then msgBox("Kan ikke åbne destination : "&targetFolder) chk=false end if end function
sub Quit() MsgBox "Forbindelsen til netværket afbrudt" WScript.Quit end sub
sub doCopy(sourceFolder,targetFolder) dim folder,fileCol,folderCol,fil Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
set folder = objFSO.getFolder(sourceFolder) set fileCol = folder.Files set folderCol=folder.SubFolders
For Each fil in filecol if not objFSO.FileExists(targetFolder&"\"&fil.name) then objFSO.CopyFile SourceFolder&"\"&fil.name, targetFolder&"\"&fil.name If Err.Number = 0 Then log "Copying file: "&sourceFolder&"\"&fil.name else Quit() end if end if next For Each folder in folderCOl if not objFSO.FolderExists(targetFolder&"\"&folder.name) then objFSO.CreateFolder(targetFolder&"\"&folder.name) If Err.Number = 0 Then log "Creating folder: "&sourceFolder&"\"&folder.name else Quit() end if
end if doCopy sourceFolder&"\"&folder.name,targetFolder&"\"&folder.name next set fileCol = nothing set folderCol = nothing set folder = nothing end sub
Dim objFSO,cont Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Nu har jeg ikke så meget "kørekort" vi VB men en kombination af din kode og "min" kode - andet har jeg ikke lige nu...
Generelt: Det kunne også være smart for dig at der oprettes en LOG fil med info om hvilke mapper/filer der er berørt samt tidspunkt (og om det gik godt) ...
Egentlig har jeg ik det vilde at bruge en log til, det drejer sig om en csv fil der skal uploades fra en bil med længdegrad & breddegrad sådan at man kan finde sin bil ;-)
Hmmm... ftp's put/mput vil copy uanset om filen er ændret eller ej...
Altså så skal der checkes om filen er ændret FØR noget som helst ftp 'ting' startes...
De her *.csv file/filer - bliver oprettet automatisk af noget andet SW ? Skriver dette SW til filen - selvom der egentlig ikke er nogen indholdsændring. Dvs ændre 'timestamp' ?
(Jeg ser på dette ind imellem andet tjenstligt arbejde...)
Spørgsmål: Er det et nyt navn (automatisk?) for hver dag/dato: 15-04-05.csv ?
Og den bliver oprettet/ændret/opdateret automatisk af andet software ? Hver gang der sker en ÆNDRING eller bliver dens TimeStamp bare ændret under alle omstændigheder for hver X tidsenhed. Det går om jeg skal "måle" på ÆNDRING i filen eller TimeStamp...
(Hvorfor er det altid sådan at noget man laver til andre bedre end det til sig selv ?)
... det er bare mht. hvilken regel jeg skal bruge for at FTP'en skal rulle igang. Jeg ved godt at du skriver 20 min. men hvis jeg får forærende at gøre det hver gang at filen's indhold bliver ændret ? Kan evt. også arrangere at FTP rulle hvert 20 min. (eller andet tal) HVIS filen's indhold er ændret ?
Jeg tror at jeg vil gøre sådan: At hvert 20 min (kan ændres let) checkes om nyeste *.csv fil (kan ændres let) i en specific mappe (kan ændres let) er ændret ifh forrige check. Hvis den er ændret i indhold/størrelse eller for den sags skyld andet navn så rulles en FTP overførsel...
sub FtpIT() CreateObject("WScript.Shell").Run BatchFile&" "&FTP&" "&Username&" "&Password&" "&FTP_Folder&" "&FolderName&"\*.*", 0, False end sub Dim objFSO,cont
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
do FtpIT WScript.Sleep SleepTimer Loop
ftpconn.bat: @echo off cls echo open %1>c:\destinatorapps\gps_tracking\tranfer.txt echo %2>>c:\destinatorapps\gps_tracking\tranfer.txt echo %3>>c:\destinatorapps\gps_tracking\tranfer.txt echo binary>>c:\destinatorapps\gps_tracking\tranfer.txt echo prompt>>c:\destinatorapps\gps_tracking\tranfer.txt echo hash>>c:\destinatorapps\gps_tracking\tranfer.txt echo cd %4>>c:\destinatorapps\gps_tracking\tranfer.txt echo mput %5>>c:\destinatorapps\gps_tracking\tranfer.txt echo bye>>c:\destinatorapps\gps_tracking\tranfer.txt echo bye>>c:\destinatorapps\gps_tracking\tranfer.txt call ftp.exe -s:c:\destinatorapps\gps_tracking\tranfer.txt del c:\destinatorapps\gps_tracking\tranfer.txt
er der nogen der kan komme med forslag til hvordan man får den til at lade være med at kopiere en fil der allerede er på serveren er de velkomne...
<henriktha>: Nu troede jeg lige at jeg havde den 99.9% klar - men min version 'dør' efter ~600 loops - læs i tråden her: http://www.eksperten.dk/spm/611384
Der gik helt sport i det. Jeg har svar/mulighed for din sidste kommentar - og lidt mere til...
Skal det være en MAPPE eller en FIL med formatet: DD-MM-YYYY (eks 24-04-2005)
Det er lettest med DD-MM-YYYY og ikke DD-MM-YY. Så er man også lidt mere sikker på hvad der er hvad når man bare ser tal...
Jeg har gjort det trix med at filer der ER blevet FTP'et OK bliver gemt i anden mappe. Derefter checkes om en given fil HAR været sendt før eller der er ÆNDRING i den ifh sidste FTP process...
... og jeg ka' forvente at ..\logs\yyyy\mmmm\dd-mm-yy altid findes / bliver automatisk oprettet "straks" ved døgnskift ?
Hvis der nu ikke har været FTP kontakt i X dage skal alle dagenes *.csv fil sendes når der opnås kontakt eller til enhver tid bare send den nyeste ? Så jeg (=programmet) ka' bare 'søge' efter den nyeste *.csv fil under C:\logs\yyyy\mmmm\dd-mm-yy ?
PS: Det er vel C:\logs\yyyy\mm\ mappen hedder med tal - eller er 'mm' (måned) skrevet med bogstaver?
Altså sådan for denne dag C:\logs\2005\april\25-04-05.csv
if NOT exist %FilePath%\ ( echo Mappen %FilePath% blev ikke fundet ? goto ERROR )
if NOT exist %FilePath%\sleep.exe ( echo Filen/programmet Sleep.exe blev ikke fundet ved %FilePath% goto ERROR )
if NOT exist %FTPToSendFolder%\ ( echo Mappen %FTPToSendFolder% blev ikke fundet ? goto ERROR )
if NOT exist %FTPCheckFolder%\ ( echo Mappen %FTPCheckFolder% blev ikke fundet ? goto ERROR )
if NOT exist %FTPIsSendFolder%\ ( echo Mappen %FTPIsSendFolder% blev ikke fundet ? goto ERROR )
REM ======================
:LOOP
REM * Extract dato felter for /F "tokens=1-3 delims=-" %%A in ("%date%") do set Year4=%%C& set Mon=%%B& set Day=%%A if %Mon:~0,1%==0 ( set MM=%Mon:~-1% ) else ( set MM=%Mon% ) for /F "tokens=%MM%" %%I in ("Jan Feb Marts April Maj Juni Juli August Oktober November December") do set MonthName=%%I
set FTPIncommingFolder=%FilePath%\%Year4%\%MonthName%
if not exist %FTPIncommingFolder%\ ( if %VerboseDebug%==1 echo The folder %FTPIncommingFolder% is not found. goto WAITLOOP )
:CHECKNEW set Newest= if %VerboseDebug%==1 echo Checking for NEWEST file in %FTPIncommingFolder% for /F "tokens=*" %%I in ('dir %FTPIncommingFolder% /D /B /A-D /O-D') do call :Process %%I if [%Newest%]==[] ( if %VerboseDebug%==1 echo The folder %FTPIncommingFolder% is empty. if %VerboseDebug%==1 echo Do notting. goto WAITLOOP ) if %VerboseDebug%==1 echo The NEWEST file in %FTPIncommingFolder% is %FTPIncommingFolder%\%Newest% goto ENDCHECKNEW
:Process if NOT [%Newest%]==[] goto :eof set Newest=%1 goto :eof
:ENDCHECKNEW
if %VerboseDebug%==1 echo Checking for a NEW file. if not exist %FTPIsSendFolder%\%Newest% ( if %VerboseDebug%==1 echo File %FTPIncommingFolder%\%Newest% IS a new file. if %VerboseDebug%==1 echo Has NOT been send before. copy %FTPIncommingFolder%\%Newest% %FTPToSendFolder%\%Newest% >nul goto FTP_CHECK )
if %VerboseDebug%==1 echo File %FTPIncommingFolder%\%Newest% has been send before. if %VerboseDebug%==1 echo Checking for update. echo n | comp %FTPIncommingFolder%\%Newest% %FTPIsSendFolder%\%Newest% >nul 2>&1 if errorlevel 1 ( if %VerboseDebug%==1 echo File %FTPIncommingFolder%\%Newest% has been updated since last send. copy %FTPIncommingFolder%\%Newest% %FTPToSendFolder%\%Newest% >nul goto FTP_CHECK ) else ( if %VerboseDebug%==1 echo File %FTPIncommingFolder%\%Newest% has NOT been updated since last send. if %VerboseDebug%==1 echo Do notting. )
:FTP_CHECK REM ====================== REM Check om der er forbindelse til pågældende FTP server sted REM ====================== echo Checking Internet connection to FTP-server: %FTP% ... ping -n 1 %FTP% >nul 2>&1 if errorlevel 1 ( if %VerboseDebug%==1 echo No response from %FTP% if %VerboseDebug%==1 echo Trying again in %FTPWait% sec. %FilePath%\sleep.exe %FTPWait% goto FTP_CHECK ) else ( if %VerboseDebug%==1 echo OK response from %FTP% goto FTP_DO )
:FTP_DO REM ====================== REM Indledende manøvre til FTP afsendelse/modtagelse REM ====================== if %VerboseDebug%==1 echo Transmiting file %FTPToSendFolder%\%Newest% to FTP-Server: %FTP% if exist %FTPCheckFolder%\%Newest% del %FTPCheckFolder%\%Newest% if exist %FTPCommandFile% del %FTPCommandFile%
echo open %FTP%>> %FTPCommandFile% echo %FTPopen%>> %FTPCommandFile% echo %FTPkode%>> %FTPCommandFile% echo verbose>> %FTPCommandFile% echo hash>> %FTPCommandFile% echo binary>> %FTPCommandFile% echo cd %FTPFolder%>> %FTPCommandFile% echo put %FTPToSendFolder%\%Newest%>> %FTPCommandFile% echo lcd %FTPCheckFolder%>> %FTPCommandFile% echo get %Newest%>> %FTPCommandFile% echo bye>> %FTPCommandFile%
REM ====================== ftp -i -s:%FTPCommandFile% REM ======================
if exist %FTPCommandFile% del %FTPCommandFile%
REM ====================== REM Check om det er gået godt - sammenligne oprindelige fil med den der blev afsendt og hentet igen. REM ====================== if %VerboseDebug%==1 echo Checking FTP reslut. if not exist %FTPCheckFolder%\%Newest% ( if %VerboseDebug%==1 echo Receive Failed... if %VerboseDebug%==1 echo Trying again in %FTPRetryWait% sec. %FilePath%\sleep.exe %FTPRetryWait% goto FTP_CHECK )
if %VerboseDebug%==1 echo Comparing transmited file with received file. echo n | comp %FTPToSendFolder%\%Newest% %FTPCheckFolder%\%Newest% >nul 2>&1 if errorlevel 1 ( if %VerboseDebug%==1 echo Files NOT identical!!! if %VerboseDebug%==1 echo Trying again in %FTPRetryWait% sec. %FilePath%\sleep.exe %FTPRetryWait% goto FTP_CHECK ) else ( if %VerboseDebug%==1 echo Files identical. goto ALL_DONE )
REM ====================== REM Alle er glade REM ======================
:ALL_DONE if %VerboseDebug%==1 echo. if %VerboseDebug%==1 echo Transmiting file %FTPToSendFolder%\%Newest% to FTP-Server: %FTP% if %VerboseDebug%==1 echo * * * DONE * * * if %VerboseDebug%==1 echo. if %VerboseDebug%==1 echo Cleaning up... copy %FTPToSendFolder%\%Newest% %FTPIsSendFolder%\%Newest% >nul del %FTPToSendFolder%\%Newest% del %FTPCheckFolder%\%Newest%
goto WAITLOOP
:ERROR echo. echo PROGRAM TERMINATED !!! echo. pause
REM ====================== REM AutoUpload.cmd REM Ver 1.0 REM 26. april 2005 REM ======================
Definer efter opgave disse variable set FTP=XX.XXX.XXX.XX set FTPopen=(Bruger) set FTPkode=(Kode) set FTPFolder=(Evt.undermappe på FTPServer)
set VerboseDebug=1 Betyder at der vises diverse beskeder under kørsel af programmet til evt. DEBUG - ellers set VerboseDebug=0
Checker om diverse mapper existere. Kan omdefineres.
Programmet sleep.exe skal existere.
Ud fra dagens dato extracter mappe navn ifølge syntaxen C:\Logs\YYYY\MM\ hvor MM er månednavnet stavet (DK) lægges i variablen %FTPIncommingFolder%
Checker om der er kommet en NY fil i %FTPIncommingFolder% som ikke har været sendt før - sammenlignet med %FTPIsSendFolder% Hvis den HAR været sendt før - checker om ændring
Hvis ingen ændring så LOOP i %LoopWait% sekunder
Hvis dermed NY fil eller ændring så copy ønsket fil til %FTPToSendFolder%
Check om der er forbindelse til defineret FTP server %FTP% vha en 'ping' - hvis ingen forbindelse så prøv igen efter %FTPWait% sekunder.
Hvis forbindelse klargør en FTP kommandofil %FTPCommandFile%
Rul %FTPCommandFile% vha 'ftp -t' I denne sekvens tilbageføres samme fil vha 'get' til lokal mappe %FTPCheckFolder%
Sammenlign modtaget fil i %FTPCheckFolder% med den afsendte i %FTPToSendFolder% Hvis ikke ens så gentag ftp processen efter %FTPRetryWait% sekunder
copy %FTPToSendFolder% til %FTPIsSendFolder% så den 'huskes' til næste LOOP
Jo... det ville være kanon hvis man kunne lave så den uploadede alle de filer i mappen der ikke fandtes på serveren, for hvis den ikke har haft ftp forbindelse og der skiftes dato mangler man jo en log fil.
Jeg må lige 'grave' sagen frem igen - også fra baggrundslager i hovedet...
Synes godt om
Ny brugerNybegynder
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.