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 :

Retour chariot avec Robocopy


Sujet :

Scripts/Batch

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Retour chariot avec Robocopy
    Bonjour,

    Je développe en ce moment un script de déploiement de VM en utilisant les classes dans PowerShell afin de m'initier à la POO. Une de mes méthodes me permet de copier un fichier VHDX (fichier lourd : environ 20Go) dans le bon répertoire. Cependant, la commande "cp" n'est pas très bavarde et je choisis d'utiliser l'outil Robocopy.exe afin d'avoir un aperçu de l'avancement de la copie du fichier.

    Le problème est que lorsque je passe par une méthode présente dans ma classe, la commande robocopy.exe ne retourne absolument rien dans la console. J'utilise alors la redirection suivante pour afficher la sortie de la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Robocopy.exe <source> <dest> <file> | Out-Default
    Le problème est qu'avec cette méthode, aucun retour chariot ne se fait donc avec le pourcentage. On se retrouve avec des centaines de lignes inutiles. Voici un exemple :

    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
    0 %
    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 %
    Pourtant, lorsque la commande Robocopy est appelée hors d'une classe, le retour chariot se fait correctement. Alors comment faire pour que la ligne s'actualise ?

    Merci d'avance.

  2. #2
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par vivitare Voir le message
    Bonjour,
    Le problème est que lorsque je passe par une méthode présente dans ma classe, la commande robocopy.exe ne retourne absolument rien dans la console.
    Si je me souviens bien, une méthode d'une classe Powershell n'émet son résultat dans le pipeline que via un return. Une instance de classe n'est pas un cmdlet.
    Citation Envoyé par vivitare Voir le message
    Voici un exemple :
    Un exemple reproductible serait préférable.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Un exemple reproductible serait préférable.
    Bonjour,

    Merci de votre réponse.

    Voici un programme de démonstration. Il faut dans un premier temps choisir le fichier à copier et ensuite indiquer le dossier de destination.

    Code PowerShell : 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
    class VM
    {
        [string] $filePath
        [string] $Path
     
        Setup_dest_path()
        {
            # Ouverture d'un explorateur Windows pour selectionner le dossier de destination
            Write-Host "Selectionner la destination du fichier"
            $object = New-Object -comObject Shell.Application
            $folder = $object.BrowseForFolder(0, $this.message, 0, $this.Path)
            if ($folder -ne $null)
            {
                $this.Path = $folder.self.Path
                Write-Host $this.Path
            }
        }
     
        File_Path()
        {
            # Ouverture d'un explorateur de fichier pour indiquer l'emplacement du fichier
            Write-Host "Veuillez choisir un fichier a copier"
            [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
                $objForm = New-Object System.Windows.Forms.OpenFileDialog
                $objForm.InitialDirectory = "c:\"
                $objForm.Title = "Choisir un fichier a copier"
                $objForm.FilterIndex = 3
                $Show = $objForm.ShowDialog()
                if ($Show -eq "Cancel") # Si l'utilisateur annule, alors on arrete le programme
                {
                    Write-Host "Annulé par l'utilisateur.`nFin."
                    exit
                }
                else  # Sinon, on recupere l'emplacement du fichier
                {
                    $this.filePath = $objForm.FileName
                    Write-Host $this.filePath
                }
        }
     
        # Methode pour copier un fichier lourd
        Copy_File()
        {
            $FileName = Split-Path $This.filePath -Leaf # Stockage du nom du fichier
            $PathDest = Split-Path $This.filePath # Stockage de l'emplacement du fichier
            Robocopy.exe $PathDest $this.Path $FileName | Out-Default  # Copie du fichier dans le dossier de destination
        }
     
    }
     
    $obj = [VM]::new() # Creation d'un objet
     
    $obj.File_Path() #Indication du fichier
    $obj.Setup_dest_path() #Indication du dossier de destination
    $obj.Copy_File()

  4. #4
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Je ne rencontre pas de pb d'affichage sous Ps v5.1 ,Windows 10 Entreprise Fr 1903
    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
    >> $obj.Copy_File()                                                                                                     
    Veuillez choisir un fichier a copier
    C:\audio.log
    Selectionner la destination du fichier
    G:\temp
    
    -------------------------------------------------------------------------------
       ROBOCOPY   ::   Copie de fichiers robuste pour Windows
    -------------------------------------------------------------------------------
    
      Début : mercredi 18 septembre 2019 19:23:40
       Source : C:\
         Dest : G:\temp\
    
        Fichiers : audio.log
    
      Options : /DCOPY:DA /COPY:DAT /R:1000000 /W:30
    
    -------------------------------------------------------------------------------
    
                               1    C:\
              Nouveau fichier                    206        audio.log
      0%
    100%
    
    -------------------------------------------------------------------------------
    
                   Total     Copié    IgnoréDiscordance     ÉCHEC    Extras
         Rép :         1         0         1         0         0         0
    Fichiers :         1         1         0         0         0         0
      Octets :       206       206         0         0         0         0
       Heures:   0:00:00   0:00:00                       0:00:00   0:00:00
    
    
       Débit :              103000 Octets/sec.
       Débit :               5.893 Méga-octets/min.
       Fin : mercredi 18 septembre 2019 19:23:40

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Je ne rencontre pas de pb d'affichage sous Ps v5.1 ,Windows 10 Entreprise Fr 1903
    Si regardez, vous avez eu 0% puis 100%. Essayez avec un fichier de plusieurs Mo ou Go et vous verrez.

  6. #6
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Même rendu :
    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
                               1    C:\Program Files (x86)\ASUS\AsusFanControlService\2.00.38\
              Nouveau fichier                  7.9 m        ACPIWMI.dll
      0.0%
      6.2%
     12.5%
     18.8%
     25.1%
     31.4%
     37.6%
     43.9%
     50.2%
     56.5%
     62.8%
     69.1%
     75.3%
     81.6%
     87.9%
     94.2%
    100%

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Même rendu :
    C'est bien ça le problème, la progression en pourcentage n'effectue pas de retour chariot lorsque Robocopy.exe est dans une classe. Donc maintenant, testez le code suivant qui effectue les mêmes actions que le programme ci-dessus mais sans l'utilisation de classe et observez bien la différence (Executez-le bien depuis une console PowerShell et non dans PowerShell ISE) :

    Code PowerShell : 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
    [string] $filePath
    [string] $Path
     
    # Ouverture d'un explorateur Windows pour selectionner le dossier de destination
    Write-Host "Selectionner la destination du fichier"
    $object = New-Object -comObject Shell.Application
    $folder = $object.BrowseForFolder(0, $message, 0, $Path)
    if ($folder -ne $null)
    {
        $Path = $folder.self.Path
        Write-Host $Path
    }
     
    # Ouverture d'un explorateur de fichier pour indiquer l'emplacement du fichier
    Write-Host "Veuillez choisir un fichier a copier"
    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
        $objForm = New-Object System.Windows.Forms.OpenFileDialog
        $objForm.InitialDirectory = "c:\"
        $objForm.Title = "Choisir un fichier a copier"
        $objForm.FilterIndex = 3
        $Show = $objForm.ShowDialog()
        if ($Show -eq "Cancel") # Si l'utilisateur annule, alors on arrete le programme
        {
            Write-Host "Annulé par l'utilisateur.`nFin."
            exit
        }
        else  # Sinon, on recupere l'emplacement du fichier
        {
            $filePath = $objForm.FileName
            Write-Host $filePath
        }
     
    $FileName = Split-Path $filePath -Leaf # Stockage du nom du fichier
    $PathDest = Split-Path $filePath # Stockage de l'emplacement du fichier
    Robocopy.exe $PathDest $Path $FileName  # Copie du fichier dans le dossier de destination

  8. #8
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Ok je comprend mieux le pb.
    Robocopy émet, je supposes, vers StdOut, le out-default affiche sur la console.
    Il faut peut être gérer cette sortie via une classe C#, un peu comme ici, ou une redirection avec start-process. Tu peux aussi redéfinir Out-Default, mais dans ton cas je ne sais si c'est viable.

    Mais le mieux est de tester ce cas avec la version 7.0 de Powershell et si le comportement est identique, tu pourras demander directement aux développeurs quelle solution utiliser s'il y en a une.
    En ce moment, je ne peux aller plus loin dans l'étude de ce cas par manque de temps.
    Tiens moi au courant, ça peut aider de connaitre la solution à ce cas.

Discussions similaires

  1. Retour chariot (avec changement de cellule)
    Par Cvanhove dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/03/2015, 16h05
  2. Réponses: 0
    Dernier message: 04/10/2012, 12h13
  3. Probleme de retour chariot avec le module WriteExcel
    Par Jim_Nastiq dans le forum Modules
    Réponses: 3
    Dernier message: 20/08/2008, 15h23
  4. Insertion de retour chariots avec sed
    Par zoullou dans le forum Shell et commandes GNU
    Réponses: 17
    Dernier message: 21/12/2007, 22h06
  5. Réponses: 4
    Dernier message: 04/09/2007, 08h51

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