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 :

Comportement étrange d'un output d'une commande.


Sujet :

Scripts/Batch

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2020
    Messages : 1
    Par défaut Comportement étrange d'un output d'une commande.
    Bonjour à tous.

    J'ai un comportement dont je n'arrive pas à comprendre... J'essaie, via la cmdlet Get-Disk d'afficher les disques et leur numéro pour que l'utilisateur puisse choisir le numéro de disque via un Read-Host.
    Ce qui est très bizarre c'est que la liste des disques apparait ... après a cmdlet Read-Host ... je ne comprends pas...
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while ($Null -eq $NumeroDisque) {
        Write-Host "Disques présents :`n"
        get-disk | Where-Object -Property BusType -NE USB | Select-Object -Property Number, @{Name="Taille en Go";Expression={[math]::round($_.Size/1GB)}} | Sort-Object -Property Number
        try {
            $NumeroDisque = [int](Read-Host -Prompt "Sur quel disque installer Windows 10 ? (rentrez son numéro) ")
        }
        catch {
            Write-Host -ForegroundColor Red "Rentrez un numéro valide."
        }
    }

    En retour j'ai ça ... :

    Nom : tempsnip.png
Affichages : 153
Taille : 28,6 Ko

    Le premier output du get-disk est complètement squizé à la première boucle, affiché 2 fois à la deuxième, puis fonctionne correctement après ...

    Quelqu'un comprend pourquoi ça me fait ça ?

    En vous remerciant.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je constate le même phénomène
    Après plusieurs tests le problème semble provenir de Read-Host.

    Ceci fonctionne correctement
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Get-Disk
    Read-Host -Prompt "RH"

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Get-ChildItem
    Read-Host -Prompt "RH"

    Ceci ne fonctionne pas correctement
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Get-Disk | Select-Object Number
    Read-Host -Prompt "RH"

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Get-ChildItem | Select-Object Name
    Read-Host -Prompt "RH"

    Lorsqu'il y a un Select-Object spécifique suivi d'un Read-Host le problème apparait et la sortir est affiché après au lieu d'avant.
    Je pense que c'est un problème généralisé à une monté de version ou alors c'est moi qui n'ai pas les yeux en face des trous.

    Bizarrement, ceci fonctionne
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Get-ChildItem | Select-Object *
    Read-Host -Prompt "RH"

    Je n'ai pas encore trouvé de trace de cette anomalie, je reste donc perplexe.

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je pense que c'est un problème de gestion de l'optimisation de la commande Select-Object. Tu peux forcer l'attente de l'affichage avec Out-Host

    Il y a bien le paramètre Wait mais il semble inefficace

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while ($Null -eq $NumeroDisque) {
        Write-Host "Disques présents :`n"
        get-disk | Where-Object -Property BusType -NE USB | Select-Object -Property Number, @{Name="Taille en Go";Expression={[math]::round($_.Size/1GB)}} | Out-Host | Sort-Object -Property Number
        try {
            $NumeroDisque = [int](Read-Host -Prompt "Sur quel disque installer Windows 10 ? (rentrez son numéro) ")
        }
        catch {
            Write-Host -ForegroundColor Red "Rentrez un numéro valide."
        }
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    il en parle ici, je ne suis pas persuadé que ce ne soit pas un bug
    https://www.reddit.com/r/PowerShell/...e_with_use_of/

  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,
    en utilisant ceci :
    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
    $numerodisque=$null
    $result=while ($Null -eq $NumeroDisque) {
        Write-Host "Disques présents :`n"
        get-disk | Select-Object -Property Number, @{Name="Taille en Go";Expression={[math]::round($_.Size/1GB)}} | Sort-Object -Property Number
        try {
            $NumeroDisque = [int](Read-Host -Prompt "Sur quel disque installer Windows 10 ? (rentrez son numéro) ")
           write-host "Numero= $numerodisque"
        }
        catch {
           write-host "Numero= $numerodisque"
            Write-Host -ForegroundColor Red "Rentrez un numéro valide."
        }
    }
    #ctrl-c pour stopper
    $result
    Tu constateras que get-disk adresse le pipeline et l'appel à Read-Host bloque l'exécution du pipeline. C'est le pourquoi de ce comportement erratique comme indiqué dans le post reddit.
    Et dans un runspace il n'y a qu'un seul objet pipeline en exécution et son exécution est synchrone.
    Il est probable que le temps d'exécution des instructions influe sur le traitement des données en attente dans le pipeline, mais cela reste une supposition...

Discussions similaires

  1. Problème de saut de ligne avec un echo d'un output d'une commande
    Par death_style dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 11/04/2012, 14h38
  2. Réponses: 0
    Dernier message: 14/09/2011, 16h27
  3. Récuperer le output d'une commande dans un .txt
    Par geeksideofme dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/03/2008, 14h05
  4. Réponses: 3
    Dernier message: 11/03/2008, 00h22
  5. Réponses: 12
    Dernier message: 04/06/2006, 00h19

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