none
[POWERSHELL] Récupérer l'arborescence d'un dossier dans plusieurs postes RRS feed

  • Question

  • Bonjour,

    j'ai besoin de récupérer la liste des répertoires contenu dans un dossier dans plusieurs poste.

    $list = Import-CSV -Path "./poste.txt"
    
    ForEach ($list in $list) { 
    	
    	get-ChildItem \\$list\c$\program files\adobe
    
    	}

    Après le must serait de le mettre dans un fichier csv en mettant le nom du poste...

    Mais pour l'instant ça marche pas et je vois pas ou est l'erreur de syntaxe...

    Merci par avance de votre aide

    cordialement.

    jeudi 20 novembre 2014 09:10

Réponses

  • Oups,

    Je corrige, je suis allé trop vite
    C'est normal, voici la bonne version :

    $list = "c$\power\"
    $machine = get-content "c:\power\machines.txt"
    $date=(get-date).Date.ToLongDateString()
    ForEach ($machines2 in $machine) { 
    $machines2+";"+(get-ChildItem \\$machines2\$list) |out-file "c:\power\$date.txt" -encoding ascii -append
    }

    Pour les administrateurs, je corrige depuis le début du sujet. Mes excuses, il manquait le mappage sur le poste distant.


    • Modifié Thierry.BT jeudi 20 novembre 2014 12:09
    • Marqué comme réponse trunksdu75 jeudi 6 août 2015 14:23
    jeudi 20 novembre 2014 12:08

Toutes les réponses

  • ForEach ($list in $list) { 
    get-ChildItem \\$list\c$\program files\adobe

    Il faut le faire de la façon suivante :

    ForEach ($list2 in $list) { 
    get-ChildItem \\$list2\c$\program files\adobe


    Une fois Ok, nous regarderons pour la suite si cette solution vous convient.

    jeudi 20 novembre 2014 09:31
  • Ca ne marche pas :(


    Il me met ça comme code erreur :

     

    Get-ChildItem : Impossible de trouver le chemin d'accès «  », car il n'existe pas.
    Get-ChildItem : Impossible de trouver le chemin d'accès «  », car il n'existe pas.
    Au niveau de ligne : 2 Caractère : 18
    +     get-ChildItem <<<< 
        + CategoryInfo          : ObjectNotFound:[Get-ChildItem], ItemNotFound
       Exception
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


    Merci par avance.


    Bien cordialement.

    jeudi 20 novembre 2014 09:44
  • ForEach ($list in $list) { 
    get-ChildItem \\$list\c$\program files\adobe

    Il faut le faire de la façon suivante :

    ForEach ($list2 in $list) { 
    get-ChildItem \\$list2\c$\program files\adobe


    Une fois Ok, nous regarderons pour la suite si cette solution vous convient.

    Il faut échapper le $ du c$.

    :

    ForEach ($list2 in $list) { 
    get-ChildItem \\$list2\c`$\program files\adobe


    Blog
    Scripts

    jeudi 20 novembre 2014 09:53
  • Alors c'est une seconde erreur  :)
    Mais la première est déjà corrigée.

    Voilà ce qu'il faut tester au départ

    $list = "c:\nomdevotrerepertoire\"
    ForEach ($list2 in $list) { 
    get-ChildItem $list2
    }
    Cette fois, vous avez un résultat non ?

    jeudi 20 novembre 2014 09:54
  • Il y a plusieurs façons de faire avec powershell.
    Je vous propose celle là :
    $list = "c:\power\" ## le chemin vers le répertoire à contrôler
    $machine = get-content "c:\power\machines.txt" ## Le nom des machines à contrôler
    ForEach ($machines2 in $machine) { 
    get-ChildItem $list
    }
    Je viens de créer ça sur mon poste, et j'ai ça à l'affichage :

        Répertoire : C:\power

    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        20/11/2014     10:58          9 machines.txt
    -a---        20/11/2014     10:48          9 poste.csv.txt

    jeudi 20 novembre 2014 10:05
  • Désolé mais ça correspond à ma problèmatique.

    En fait, le nom du poste change en fonction de ce qu'il trouve dans le fichier .txt. C'est vraiment là pour moi la difficulté. J'ai besoin, si le fichier contient 130 nom de poste, me sorte un listing du répertoire 130 fois....

    J'ai du mal, à voir comme négocier cette partie.

    En tout cas merci encore pour le temps que tu m'accords

    jeudi 20 novembre 2014 10:17
  • Bonjour,

    Ce script fonctionne bien chez moi:

    $list = get-content -Path "c:\txt.txt"
    
    ForEach ($i in $list) { 
    
    	
    	get-ChildItem -path "\\$i\c$\Temp"
    
    	}


    A+


    L’information n’a de valeur que si elle est partagée!! AK



    • Modifié Ahmed KASMI jeudi 20 novembre 2014 10:45
    • Proposé comme réponse Ahmed KASMI jeudi 20 novembre 2014 11:38
    jeudi 20 novembre 2014 10:24
  • Ok

    Mais c'est bien ce que j'ai compris.
    Si vous voulez un script complet, il faut utiliser de cette manière :

    $list = "c$\power\"
    $machine = get-content "c:\power\machines.txt"
    $date=(get-date).Date.ToLongDateString()
    ForEach ($machines2 in $machine) { 
    $machines2+";"+(get-ChildItem \\$machines2\$list) |out-file "c:\power\$date.txt" -encoding ascii -append
    }


    Vous allez avoir la liste pour chaque machine, le nom du fichier créé est à la date du jour.
    Voici le résultat sur ma machine (je renseigne 3 fois le nom de ma machine pour que vous puissiez voir le résultat sur plusieurs lignes) :

    localhost;machines.txt poste.csv.txt
    localhost;machines.txt poste.csv.txt
    localhost;machines.txt poste.csv.txt




    • Proposé comme réponse Ahmed KASMI jeudi 20 novembre 2014 11:38
    • Modifié Thierry.BT jeudi 20 novembre 2014 12:10
    jeudi 20 novembre 2014 10:25
  • Je vous propose celui-ci, il faut par contre avoir le remote management actif sur les destinations.

    Param(
    [string] $output,
    [string] $input,
    [string] $tdir
    )
    
    $servers = Get-content $input
    invoke-command -ComputerName $servers -ScriptBlock {Param($tdir) Get-ChildItem $tdir  } -ArgumentList $tdir | select PSComputerName,name | convertto-csv | Out-File $output

    Si vous voulez une sortie par serveur :

    Param(
    [string] $output,
    [string] $input,
    [string] $tdir
    )
    
    $servers = Get-content $input
    $r = invoke-command -ComputerName $servers -ScriptBlock {Param($tdir) Get-ChildItem $tdir  } -ArgumentList $tdir | select PSComputerName,name
    
    
    $r | Group-Object PSComputerName | foreach { $_.group | convertto-csv | Out-File ($_.name + '_ $($output).csv' }



    Bruce Jourdain de Coutance - Consultant MVP Exchange http://blog.brucejdc.fr


    • Proposé comme réponse Bruce JDC jeudi 20 novembre 2014 11:04
    • Modifié Bruce JDC jeudi 20 novembre 2014 11:23
    jeudi 20 novembre 2014 11:03
  • Merci pour votre aide.

    Thierry, je comprend toujours pas comment on fait pour a chaque tout de boucle, cela chèque un nouveau poste.

    Là, le script chèque que mon pc maitre.

    En fait au niveau du chemin il faudrait quelques choses \\$poste\c$\program files\adobe

    Parce que en faisant, ça il me colle tous les noms de poste à la suite des autres. Alors peut-être que dans mon fichier, je dois mettre une séparation comme des ";". Et lui dire, à chaque fois que tu vois ";" recommence ton action.

    Et ce qui est très bizarre, c'est que dans le fichier de sortie, j'ai que le nom des postes qui sont mis, et non le résultat de la commance

    Bruce, c'est trop compliqué pour moi. :(. Je ne vois même pas ce qu'il faut modifier.



    • Modifié trunksdu75 jeudi 20 novembre 2014 11:28
    jeudi 20 novembre 2014 11:24
  • Vous avez quoi comme valeur pour cette variable ?
    $list = "c$\power\"
    C'est ici que vous devez donner le nom du répertoire. Pas celui du poste.
    Ce qu'il faut comprendre, c'est cette partie :
    $machine = get-content "c:\power\machines.txt"
    Par la suite, le script dit simplement :
    Tu fais une boucle et tu parcours l'ensemble des noms de machines contenus dans le fichier machines.txt. Pour chaque machine, tu viens chercher le contenu du répertoire $list (ex : c:\power\ sur ma machine)
    Et tu renseignes ça dans le fichier sous la forme nomdemachine + contenu du répertoire parcouru.

    Premier passage dans la boucle Foreach =
    1er nom de machines contenu dans la liste machines.txt + chemin d'accès du répertoire soit :                                                       machine xxx  + contenu de c:\power\
    Second passage = second nom + chemin du répertoire ...etc
    Mieux avec l'explication ?





    • Modifié Thierry.BT jeudi 20 novembre 2014 12:11
    jeudi 20 novembre 2014 11:33
  • \\'parw00161442; parw00133400'\c$\program files\adobe

    sachant que j'ai mis '$list = "\\'$machine'\c$\program files\adobe"'

    Merci pour l'explication. Mais ce que je comprends pas, tout ce passe bien. Mais quand je vérifie il me liste uniquement, ce qui y'a dans le répertoire de mon poste, et non de ceux indiquer dans mon fichier.


    • Modifié trunksdu75 jeudi 20 novembre 2014 11:46
    jeudi 20 novembre 2014 11:39
  • '$list = "\\'$machine'\c$\program files\adobe"' = FAUX

    $list ="c:\program files\adobe" = OK

    :)

    jeudi 20 novembre 2014 11:51
  • OUi ça marche comme ça :)

    Mais ça ne lit quand dans mon répertoire local. et non sur les postes distant.

    Mon fichier ressemble à ça :

    PARW00161442;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00161047;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00142164;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00141499;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00151300;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00142455;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00161176;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00153341;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00142110;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00161048;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00161208;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00161267;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player
    PARW00150990;Adobe Captivate Quiz Results Analyzer 1.5 Adobe Captivate Reviewer 2.5 Adobe Help Adobe Photoshop CS4 Adobe Reader 10.1 Adobe Utilities Flash Player

    J'ai bien le nom de poste qui change. Mais le répertoire checker et toujours le mien en local :(

    Le pire c'est que je sens qu'on est tout proche. Encore merci pour ta patience.


    • Modifié trunksdu75 jeudi 20 novembre 2014 11:57
    jeudi 20 novembre 2014 11:57
  • Oups,

    Je corrige, je suis allé trop vite
    C'est normal, voici la bonne version :

    $list = "c$\power\"
    $machine = get-content "c:\power\machines.txt"
    $date=(get-date).Date.ToLongDateString()
    ForEach ($machines2 in $machine) { 
    $machines2+";"+(get-ChildItem \\$machines2\$list) |out-file "c:\power\$date.txt" -encoding ascii -append
    }

    Pour les administrateurs, je corrige depuis le début du sujet. Mes excuses, il manquait le mappage sur le poste distant.


    • Modifié Thierry.BT jeudi 20 novembre 2014 12:09
    • Marqué comme réponse trunksdu75 jeudi 6 août 2015 14:23
    jeudi 20 novembre 2014 12:08
  • Ca marche!!!!!

    Trop bien, merci beaucoup :)

    jeudi 20 novembre 2014 13:02
  • Avec plaisir.

    La solution de Bruce est beaucoup plus souple, mais demande une connaissance un peu plus poussée de Powershell. A creuser pour vous par la suite.
    N'hésitez pas à cliquer sur "Proposer comme réponse" au dessous de la solution, c'est important pour les participants.

    Cordialement

    jeudi 20 novembre 2014 13:07
  • Avec plaisir.

    La solution de Bruce est beaucoup plus souple, mais demande une connaissance un peu plus poussée de Powershell. A creuser pour vous par la suite.
    N'hésitez pas à cliquer sur "Proposer comme réponse" au dessous de la solution, c'est important pour les participants.

    Cordialement


    J'aimerai bien mais je peux pas :/
    jeudi 20 novembre 2014 14:03
  • Bonjour,

    Ce doit être réservé aux administrateurs.
    Je ne connais pas encore bien le fonctionnement.

    Cordialement

    vendredi 21 novembre 2014 06:35