Upload FTP automatico con Windows

Oggi mi è capitato di dover programmare l’upload automatico di un file sotto Windows XP Professional. È stata come sempre un’esperienza molto istruttiva: in fondo, adottando gli stratagemmi più vari, si può ottenere anche da Windows qualcosa di vagamente simile al comportamento di `cron` sui server Linux. Solo vagamente, non voglio illudere nessuno. Però si può fare. Ecco come.

Supponiamo di dover spostare ogni ora una copia del file PROVA.TXT sul seguente server FTP:

host: FTP.ESEMPIO.NET
user: UTENTE
pass: QWERTY
destinazione: /MIA/CARTELLA/

Per prima cosa dobbiamo realizzare uno script batch in grado di aprire una connessione FTP, spostare il file e poi chiudere la connessione medesima.

Ecco lo script che ho realizzato e salvato nel file UPLOADME.BAT:

@echo off
echo user UTENTE> ftpcomm.dat
echo QWERTY>> ftpcomm.dat
echo bin>> ftpcomm.dat
echo cd /MIA/CARTELLA/>>ftpcmd.dat
echo put %1>> ftpcomm.dat
echo quit>> ftpcomm.dat
ftp -n -s:ftpcomm.dat FTP.ESEMPIO.NET
del ftpcomm.dat

Semplice e lineare. Da linea di comando la pubblicazione del file PROVA.TXT si ottiene semplicemente con il comando:

uploadme "C:Documents and SettingsIvan AgliardiDocumentiPROVA.TXT"

Ora viene – per assurdo – la parte più complicata. Windows non è dotato di un vero sistema di cron, quindi dovremo ricorrere alle famigerate Operazioni pianificate (alias, Task Scheduler).

Cito testualmente da https://support.microsoft.com/kb/308569/it:

Per aprire Operazioni pianificate, fare clic sul pulsante Start, scegliere Tutti i programmi, Accessori, Utilità di sistema, quindi fare clic su Operazioni pianificate.

Per pianificare una nuova operazione:

1. Fare doppio clic su Aggiungi operazione pianificata per avviare Pianificazione guidata operazioni, quindi fare clic su Avanti nella prima finestra di dialogo.
2. Nella successiva finestra di dialogo viene visualizzato un elenco dei programmi installati nel computer come parte del sistema operativo Windows XP o come risultato di un’installazione software.

Utilizzare uno dei seguenti metodi:

Se il programma che si desidera eseguire è presente nell’elenco, selezionarlo, quindi fare clic su Avanti.
Se si desidera invece eseguire un programma, uno script o un documento non presente nell’elenco, fare clic su Sfoglia, selezionare la cartella e il file desiderati, quindi scegliere Apri.
3. Digitare un nome per l’operazione e selezionare una delle seguenti opzioni:

Ogni giorno
Ogni settimana
Ogni mese
Una sola volta
All’avvio del computer (prima dell’accesso di un utente)
All’accesso dell’utente (solo dopo l’accesso dell’utente corrente)
4. Fare clic su Avanti, specificare le informazioni relative all’ora e al giorno in cui eseguire l’operazione, quindi scegliere Avanti.

Le informazioni relative alla data e all’ora di esecuzione dell’operazione variano in base alla selezione effettuata nella precedente finestra di dialogo della procedura guidata. Se ad esempio è stata selezionata l’opzione Ogni settimana, è necessario indicare il giorno della settimana, l’ora e se l’operazione deve essere eseguita ogni settimana, ogni due settimane, ogni tre settimane e così via.

5. Digitare il nome e la password dell’utente associato all’operazione. Verificare di selezionare un utente che disponga di autorizzazioni sufficienti per eseguire il programma. In base all’impostazione predefinita, verrà selezionato il nome dell’utente corrente che ha effettuato l’accesso.
6. Fare clic su Avanti, quindi scegliere Fine dopo aver controllato le selezioni effettuate.

Fine della citazione… Ora, il problema un po’ più serio consiste nel fatto che l’interfaccia del Task Scheduler non offre grandi possibilità di scelta per quanto riguarda la temporizzazione: se voglio eseguire lo script ogni ora devo prima creare un’operazione pianificata con una delle temporizzazioni disponibili e poi modificarla accedendo alle sue Opzioni avanzate.

Che cosa ci sia di avanzato nell’eseguire un evento ogni 7 minuti – ad esempio – anziché una volta al giorno, questo non mi è chiaro. Mi è chiaro però che le opzioni avanzate mi permettono di impostare la ripetizione automatica dell’operazione ogni n minuti, ottenendo di fatto una rudimentale forma di `cron`.

Condivido
18 Commenti
  • kumo
    Novembre 27, 2008

    Ciao! Come posso fare a caricare sul mio server in automatico un’intera cartella (con tutto il suo contenuto, che non conosco a priori) periodicamente in automatico??
    Ciao e Grazie!

  • Ivan Agliardi
    Novembre 27, 2008

    Ciao kumo,

    mi sembra che nelle mie istruzioni ci sia praticamente tutto quello che ti serve. Qual è il punto che non ti è chiaro? Fammi sapere: ti do volentieri una mano.

    Ciao 😉

    Ivan

  • kumo
    Novembre 27, 2008

    Ciao! Non riesco a caricare la cartella! Con nessuno di questi tentativi:
    C:Documents and SettingsFedeCriDesktop>uploadme C:avatar
    C:Documents and SettingsFedeCriDesktop>uploadme C:avatar
    C:Documents and SettingsFedeCriDesktop>uploadme C:avatar*.*

    Mi restituisce “errore durante l’apertura del file AVATAR”… è come se i caratteri jolly non funzionassero…

  • kumo
    Dicembre 2, 2008

    Ivan??? Mi aiuteresti x fav?

  • Ivan Agliardi
    Dicembre 2, 2008

    Ciao kumo! Eppur mi sono scordato di te, come ho fatto, non so 😉

    Credo che la soluzione al tuo problema sia semplice: sostituisci l’istruzione put che si trova alla 6^ riga del batch che ho pubblicato nel mio post con l’istruzione mput. Ecco lo script definitivo:

    @echo off
    echo user UTENTE> ftpcomm.dat
    echo QWERTY>> ftpcomm.dat
    echo bin>> ftpcomm.dat
    echo cd /MIA/CARTELLA/>>ftpcmd.dat
    echo mput %1>> ftpcomm.dat
    echo quit>> ftpcomm.dat
    ftp -n -s:ftpcomm.dat FTP.ESEMPIO.NET
    del ftpcomm.dat

    Okkio, non l’ho provato perché non ho assolutamente tempo in questo momento, ma dovrebbe funzionare… Fammi sapere in ogni caso come è andata, OK?

    Ivan Agliardi

  • kumo
    Dicembre 2, 2008

    Grazie della risp, Ivan ma la situazione è peggiorata… oltre a non caricare una cartella intera, adesso non carica nemmeno un singolo file… mi si blocca a questo punto:
    ftp> bin
    200 TYPE is now 8-bit binary
    ftp> mput stewie.jpg
    mput stewie.jpg? quit
    ftp>

  • Ivan Agliardi
    Dicembre 2, 2008

    Interessante… potrebbe trattarsi della modalità prompt che nell’ftp da linea di comando di Windows è on per default con mput.

    Io continuo a non poter accedere ad una macchina Windows per fare questo test, quindi ti do la dritta, tu ci provi, e se funziona mi confermi… ok? Se non funzionasse ci guardo appena ho due minuti… Dunque, prova questo:

    @echo off
    echo user UTENTE> ftpcomm.dat
    echo QWERTY>> ftpcomm.dat
    echo bin>> ftpcomm.dat
    echo cd /MIA/CARTELLA/>>ftpcmd.dat
    echo prompt>> ftpcomm.dat
    echo mput %1>> ftpcomm.dat
    echo quit>> ftpcomm.dat
    ftp -n -s:ftpcomm.dat https://FTP.ESEMPIO.NET
    del ftpcomm.dat

    Spiegazione: ho aggiunto l’istruzione prompt, che mette a off il prompt interattivo (riga 6). Prova e fammi sapere.

    Attendo speranzoso 😉

    Ivan Agliardi

  • kumo
    Dicembre 2, 2008

    Grazie!!! Funziona!!! 😀 Un ultima domanda pero’ 🙂 Come faccio ad inserire nel codice la cartella che voglio caricare SENZA doverla passare da DOS come parametro??? In pratica voglio che il programmino parti semplicemente cliccandoci 2 volte 😀

  • Ivan Agliardi
    Dicembre 3, 2008

    Se non ho capito male tu vuoi che questo semplice script includa direttamente il path della directory da spostare via FTP e non lo richieda come argomento. Beh, è una cosa piuttosto semplice:

    @echo off
    echo user UTENTE> ftpcomm.dat
    echo QWERTY>> ftpcomm.dat
    echo bin>> ftpcomm.dat
    echo cd /MIA/CARTELLA/>>ftpcmd.dat
    echo prompt>> ftpcomm.dat
    echo mput C:avatar >> ftpcomm.dat
    echo quit>> ftpcomm.dat
    ftp -n -s:ftpcomm.dat https://FTP.ESEMPIO.NET
    del ftpcomm.dat

    Se non dovesse funzionare (ti ricordo che io uso sempre e solo Linux anche sul portatile da cui ti scrivo) prova a sostituire

    echo mput C:avatar >> ftpcomm.dat

    con

    echo mput C:avatar* >> ftpcomm.dat

    Fammi sapere 😉

    Ivan Agliardi

  • kumo
    Dicembre 11, 2008

    Perfetto Grazie! Ma perchè non mi vede i caratteri jolly??? Ad es:
    echo mput “C:/avat*/nuovi/*.gif” >> ftpcomm.dat Mi restituisce errore in quanto non trova la cartella avatar!

  • Ivan Agliardi
    Dicembre 11, 2008

    Ciao kumo, consulta la help di ftp sotto DOS 😉

    Ivan

  • kumo
    Dicembre 11, 2008

    Dovrei passare da traferimento binario a trasferimento ascii??? eppure la parte finale “*.gif” non da problemi! Perchè ho problemi solo con l’abbreviazione della cartella???

  • Ivan
    Dicembre 12, 2008

    Ciao Kumo

    Anche io ho lo stesso problema… tu hai risolto?

    Grazie 1000
    Saluti

  • Daniele
    Luglio 7, 2009

    è tutto bello , solamente che c’è un piccolo problema non trascurabile , se tu utilizzi questo script e hai un qualche problema di connessione il dato sul sito ftp potrebbe arrivare non corretto perchè non c’è un compare tra il dato locale e quello remoto ed è un pò qui il punto di non affidabilità del ftp , hai qualche soluzione?

    • Ivan Agliardi
      Luglio 7, 2009

      Ciao Daniele,

      il post a cui ti riferisci è solo la riposta pubblica ad una richiesta che mi era stata fatta, richiesta che prevedeva espressamente l’utilizzo del solo protocollo FTP. Come tu stesso indichi, i limiti di cui parli sono quelli propri del protocollo FTP, che non effettua alcun compare tra il file di origine e quello di destinazione, anche se nella maggior parte degli scenari l’eventuale problema di connessione viene rilevato e il transfer fallisce, dipende tutto dal sistema operativo e/o dal software che gestisce l’operazione. Una soluzione alternativa è senza dubbio quella di utilizzare software come rsync sotto windows. Trovi un tutorial per realizzare una semplice soluzione con rsync a questo indirizzo: https://www.fabriziosinopoli.it/2008/02/18/backup-con-rsync-in-windows/

      Have fun! 😉

  • stefano
    Maggio 9, 2017

    Ciao,
    posto il fatto della tua disponibilità vorrei porti un quesito.
    Devo caricare un file via ftp. Creato lo script eseguito via shell (dos) funziona tutto perfettamente, tipo
    c:\invio.bat pippo.xxx, mi carica il file correttamente dove ho scritto nello script.
    Aprendo invece task scheduler di windows ed inserendo lo script nel “Programma o script” ed aggiungendo il file che devo caricare come “argomento”, lo script gira ma dice che non trova il file pippo.xxx. Eppure script e file sono nella stessa cartella di partenza.
    Hai qualche suggerimento?
    Grazie

    • ziovanja
      Maggio 16, 2017

      Ciao Stefano,
      ho visto solo ora il tuo commento, come vedi il blog non è molto aggiornato causa mia mancanza di tempo cronica, ma se non hai ancora risolto dopo una settimana e mi mandi più info cerco di darti una mano volentieri.
      Ciao 😉
      Ivan

  • marco bo
    Febbraio 5, 2021

    Ciao,

    su windows server crea un errore

    425 Can’t open data connection

    sapresti aiutarmi

Leave a comment