IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Télécharger des fichiers sur un ftp et les classer


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut Télécharger des fichiers sur un ftp et les classer
    Salut,

    Je débute en PowerShell mais j'aimerais faire cela :

    1 - Télécharger tous les fichiers dans un dossier (horodaté) d'un ftp
    2 - Une fois téléchargé les classer dans des dossiers en fonction de leur nom car ils répondront à une nomenclature par exemple le fichier 0109_215_DUCS.txt sera classé dans le dossier 0109 puis dans le dossier 215. \0109\215\0109_215_DUCS.txt
    3 - Envoyé par mail un log de confirmation d'exécution ou pas du script

    Cela est-il réalisable ? Si oui avez vous des débuts de pistes, ou des scripts qui pourront m'aider ?

    Merci d'avance.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Vu que cela pourrait être réalisé même en Batch (langage pourtant moins puissant à ce niveau), il n'y a pas de raisons que ce ne soit pas le cas en PS.

    Après, je ne connais pas ce langage, il faudra regarder du côté des ressources / tutos de Laurent Dardenne pour commencer.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Tu peux m'orienter de façon plus précise ?

    Avec des exemples ?

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Si c'était le cas, ce serait déjà fait... Je te l'ai dit, je ne connais pas PS.
    Épluches les tutos de Laurent, pour commencer, afin de voir un peu les différents concepts du langage.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par papafred
    Cela est-il réalisable ?
    La récupération FTP ne sera pas native, car il n'existe pas de cmdlet gratuit le permettant.
    Pour le point 2 je supposes que tu auras un répertoire temporaire.
    Pour le point 3, l'envoi de mail est possible en utilisant les classes dotnet, la confirmation d'exécution du script nécessite qq précisions de ta part.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    1 - Pour la partie récup de fichier, comment lui dire de prendre tous les fichiers ?
    Les scripts que j'ai pu voir, n'était que pour un seul fichier.

    2 - Comment crée-t-on un dossier avec un nom horodaté ?

    3 - Comment peux-t-on déplacé des fichiers et les filtrés ?

    Je ne pars de rien Merci de votre aide

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Pour
    Citation Envoyé par papafred
    1 - Télécharger tous les fichiers dans un dossier (horodaté) d'un ftp
    Tu veux dire télécharger du poste vers le FTP ou télécharger du FTP vers le poste ?
    Citation Envoyé par papafred
    Je ne pars de rien
    Ce n'est pas un soucis, mais il faut éviter d'aller plus vite que la musique :-)
    Peux-tu déjà répondre aux questions précédente, et préciser ton besoin. Plus y a d'explications détaillées mieux c'est.
    Quel OS ? Quelle version de PowerShell ? Peux-tu installer des librairies additionnelles ou pas (exemple)?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Pour

    Tu veux dire télécharger du poste vers le FTP ou télécharger du FTP vers le poste ?
    Du FTP vers le Poste



    Citation Envoyé par Laurent Dardenne Voir le message
    Quel OS ? Quelle version de PowerShell ? Peux-tu installer des librairies additionnelles ou pas (exemple)?
    Os : Seven ; Powershell 2.0 ; Installation de librairie oui c'est possible

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    pour le dossier horodaté j'ai trouvé cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    md "mow_$((get-date).toString('dd-MM-yyyy'))"

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Si c'est pour un usage personel, tu peux télécharger une version gratuite de /n software NetCmdlets - Hobbyist License qui propose Get-Ftp et Send-Ftp et d'autres cmdlets de gestion réseau :
    NetCmdlets include a broad range of network management and messaging capabilities. The current release contains more than 30 Cmdlets implementing major networking protocols such as SNMP, LDAP, DNS, Syslog, HTTP, WebDav, FTP, SMTP, POP, IMAP, Rexec/RShell, and more.
    Sinon il reste possible d'utiliser Ftp.exe, on effectue 2 passes de récupération, la première pour les répertoires, la seconde pour les fichiers.
    Pour le moment je n'ai testé que la première partie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     #Récupération de fichiers d'un serveur FTP 
    $LASTEXITCODE=0 
    $FtpServer="ftp-truc.com"
    $UserName="user-name"
    $PassWord="Xyz58"
    $RemoteStartDirectory="/"
    $LocalStartDirectory="C:\Temp\TestFTP" 
     
    $GetAllDirectories_FtpCmd=@"
    open $FtpServer
    user $UserName $PassWord
    cd $RemoteStartDirectory
    ls -aR
    "@ 
     
    Filter Test-FTPErreur ([string] $FtpServer, $code){
      $isError=$False
      $CurrentObject=$_
        Write-Debug "code : $CODE"
        Write-Debug "objet : $CurrentObject"
     
      switch ($LASTEXITCODE) { 
       { #http://www.mail-production.com/commandftp.html   
       ($_ -eq 0) }  { if (($CurrentObject -match "^Login incorrect.$") -or
                           ($CurrentObject -match "^Hôte inconnu") -or
                           ($CurrentObject -match "^Commande non valide.") -or
                           ($CurrentObject -match "^Cannot connect to (.*) - timed out.$") -or
                           ($CurrentObject -match "No such directory.$"))
                        {$isError=$True}
                     }   
       default {$isError=$True}  # cas non prévu ou pas encore recensé
      }#Switch    
     
     if ($isError) 
      {Throw "[$FtpServer] Erreur FTP -code $CODE : $CurrentObject" } 
     else 
       #Réémet l'objet dans le pipeline
      {$CurrentObject}
    }
     
     #récupère tous les répertoires du serveur
     #FTP.exe supporte la redirection en entrée, on y émet nos commandes
    $Directories=$GetAllDirectories_FtpCmd|
                   #-i pas de confirmation
                   #-n pas de demande de user ID et password
                   ftp -i -n |
                    #Test si la connexion aboutie
                   Test-FTPErreur $FtpServer $LASTEXITCODE |
                    #On ne réémet que les noms de répertoire                              
                   Where-Object {$_ -match "./(.*):$" }|
                    #On ne récupère que le nom du répertoire 
                   Foreach-Object {$Matches[1]}
     
     #Récupère tous les fichiers de tous les répertoires du serveur
     #Sous PowerShell on peut mixer les caractères / et \ dans un nom de chemin.
     #On construit dynamiquement la liste des commandes mget, exemple :
     #  mget tmp/dir1/*.* C:\Temp\tmp/dir1
    $GetAllFiles_FtpCmd=@"
    open  $FtpServer
    user $UserName $PassWord
    $($Directories|% {"mget $_/*.* $LocalStartDirectory\$_`r`n"})
    "@ 
     
    $GetAllFiles_FtpCmd|
      ftp -i -n |
      Test-FTPErreur $FtpServer $LASTEXITCODE
    A toi de voir quelle approche te convient.
    Pour les cmdlets dédiés il y a qq exemples sur le net pour effectuer ce type de traitement. Si je les retrouve je les ajouterais.

    Donc première chose, récupérer les fichiers au bon endroit

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papafred Voir le message
    pour le dossier horodaté j'ai trouvé cela :
    Oui c'est une manière de faire, il y a aussi celle -ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "mow_$(get-date -f 'dd-MM-yyyy')"
    Concernant les exemples sur NetCmdlets, tu peux consulter ce blog :
    http://geekswithblogs.net/Lance/Tags...s/default.aspx
    http://geekswithblogs.net/Lance/arch...owerShell.aspx

    Sinon pense à utiliser la balise code pour tes prochains posts.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Après un WE de formation et de lecture voici le code, ca commence à émerger :

    prise des fichiers sur le FTP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function prendre_ftp
    {
    $url="ftpperso.free.fr"
    $file="C:\ftp_instru.txt"
    ftp -i -n -s:$file $url
    }
    Inconvénients : le fichier texte contient le mot de passe en clair

    J'aimerais pouvoir "parler" avec le fichier "ftp.exe" afin d'éviter d'utiliser un fichier texte, des idées ? J'ai oublié de préciser je veux codé moi même car je ne veux pas utiliser des dll de tiers.

    Puis une fois que les fichiers sont téléchargés dans "c:\temp\download" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #liste les *.txt dans un fichier texte à la ligne un par un
    Get-ChildItem C:\temp\download -include *.txt -name >c:\temp\listing.txt
    #sépare chaque nom de fichier texte en une variable $name
    $source = Get-Content c:\temp\listing.txt
    $contenu = "periode","dossier","contenu"
    $popol = Import-CSV c:\temp\listing.txt –header $contenu -delimiter "_"
    #pour chaque ligne une variable est donnée
    foreach($name in $popol)
    {
    #ici on tape le code que l'on veut executé pour chaque fichier
    cd c:\temp
    $dossier1=Test-Path -path ("C:\temp\"+$name.periode)
    if ([string]$dossier1 -eq "True") {echo ("Le dossier suivant existe déjà : "+"C:\temp\"+$name.periode)} else
    { mkdir $name.periode}
    cd $name.periode 
    $dossier2=Test-Path -path("C:\temp\"+$name.periode+"\"+$name.dossier)
    if ([string]$dossier2 -eq "True") {echo ("Le dossier suivant existe déjà : "+"C:\temp\"+$name.periode+"\"+$name.dossier)} else
    {mkdir $name.dossier} 
    foreach($fichier in $source)
    {echo $fichier
    copy ("c:\temp\download\"+$fichier) ("c:\temp\"+$name.periode+"\"+$name.dossier)
     } }

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papafred
    Inconvénients : le fichier texte contient le mot de passe en clair
    Oui c'est le problème
    Peut être utiliser un objet PSCredential :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $credential=Get-Credential UserName
    $credential.UserName
    $credential.Password
    Mais il faudra peut être utiliser les API de cryptographie, car la proprieté password peut être récupérée
    Citation Envoyé par papafred
    J'aimerais pouvoir "parler" avec le fichier "ftp.exe" afin d'éviter d'utiliser un fichier texte, des idées ?
    Consulte le code que j'ai proposé précédement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     #récupère tous les répertoires du serveur
    #FTP.exe supporte la redirection en entrée, on y émet nos commandes

  14. #14
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Je me permets qq remarques concernant ton code.

    Tu peux simplifier les instructions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $dossier1=Test-Path -path ("C:\temp\"+$name.periode)
    if ([string]$dossier1 -eq "True")
    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      
    if (Test-Path "C:\temp\$($name.periode)")
    Attention à ne pas confondre/mixer les types :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if ([string]$dossier1 -eq "True") 
    if ($Dossier1 -eq $True) 
     #simplifié en 
    if ($Dossier1)
    PowerShell est dynamique, donc sans typage, ce serait dommage de ne pas l'utiliser ;-)
    Ensuite, comme tu utilises du code spécifique à la V2 tu devrais ajouter cette clause en début de script :
    Attention echo est un alias de Write-Output qui à un comportement différent de Write-Host,
    le premier écrit dans le pipeline OU à l'écran, tu peux donc avoir des effets de bord, selon le contexte d'utilisation. La sortie de Write-Host se fait tjr à l'écran.

  15. #15
    Membre émérite Avatar de suchiwa
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2010
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 435
    Par défaut $LASTEXITCODE et ;exit
    Bonjour,

    Je rebondis sur votre gestion des erreurs.

    La fonction suivante permet l'arrêt d'un script en cas d'erreur d'une application Win32, tel que IIS ou SQL.

    Je pense que ce code peut être... condensé, voir amélioré.
    Trap ; break n'est pas utilisé car ici je veux évaluer $LASEXITCODE que je loggue dans un fichier pour traitement ultérieur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function LogErr {
    
    param ([string]$app = $null)
    # Je pense pas que c'est très utile ici
    $ErrorActionPreference = "Stop"
    $LASTEXITCODE 
       if ($LASTEXITCODE -ne 0)
       {
    	write-host "Erreur $LASTEXITCODE!"
    	"$app has failed.Error $LASTEXITCODE" >> ($logDir+"FlexErr.log") # la variable $logdir est déclaré à "C:\"
    	;exit # pas très propre je trouve
       }
       else    {
    	write-host "Pas d'erreur $app!"
       }
    }
    Il me semble que je passe à coté du fonctionnement normal de la gestion des erreurs.

    @Laurent, j'ai bien lu le chapitre 4 du guide de référence, cependant j'ai l'impression que dans mon cas, je veux transformer le résultat d'une erreur non-critique en erreur critique.

    Si l'on peut travailler avec un trap, break sur une appli win32 plus propre et lisible, je suis à l'écoute !

    Vincent

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 3
    Par défaut sauvegarder de dossiers vers ftp
    bonjour,

    j'ai fait un script qui marche tres bien pour sauvegarder mes dossiers, fichiers et sous dossiers vers un serveur FTP...
    Le problème, c'est que si je rajoute un fichier dans mon dossier il me recopie tout or moi j'ai besoin qu'il me copie que le nouveau fichier ou dossier ou fichier modifier et non reprendre tout ce qui a déjà été copié
    quelqu'un pourrait-il m aider ?

    en vous remerciant.

    Voici le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    $user = "USER FTP"
    $password = "PASSWORD FTP"
    $localdir = "DOSSIER SOURCE"
    $ftpdir = "DESTINATION"
     
    $client = New-Object System.Net.WebClient 
    $client.Credentials = New-Object System.Net.NetworkCredential($user,$password) 
     
    $parentfolder = $localdir.split("\")[-1]
    Write-Host "Création de $parentfolder"
    $makedir = [System.Net.WebRequest]::Create($ftpdir+$parentfolder);
    $makedir.Credentials = New-Object System.Net.NetworkCredential($user,$password) 
    $makedir.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory;
    $makedir.GetResponse();
    
     
    foreach($item in Get-ChildItem -recurse $localdir){ 
     
        $filename = [system.io.path]::GetFullPath($item.FullName).SubString([system.io.path]::GetFullPath($localdir).Length + 1)
     
        if ($item.Attributes -eq "Directory"){
     
            try{
                Write-Host "Création de $item.Name"
     
                $makedir = [System.Net.WebRequest]::Create($ftpdir+"/"+$parentfolder+"/"+$filename);
                $makedir.Credentials = New-Object System.Net.NetworkCredential($user,$password) 
                $makedir.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory;
                $makedir.GetResponse();
     
                }
                catch [Net.WebException] {
                Write-Host $item.Name probably exists ...
                }
     
                continue;
            }
     
            Write-Host "Transfert de $item..."
            $file = New-Object System.Uri($ftpdir+"/"+$parentfolder+"/"+$filename) 
            $client.UploadFile($file, $item.FullName)
        }
    pause

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/05/2015, 15h40
  2. Réponses: 0
    Dernier message: 04/10/2010, 11h36
  3. [FTP] Télécharger un fichier sur le serveur
    Par djflex68 dans le forum Langage
    Réponses: 1
    Dernier message: 21/01/2008, 21h08
  4. un conseil pour exporter des fichier sur un serveur ftp
    Par pierrot67 dans le forum Delphi
    Réponses: 1
    Dernier message: 03/12/2006, 11h15
  5. Réponses: 2
    Dernier message: 10/10/2006, 09h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo