Question
Script recherche doublons
- Meo
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 5
- Remerciements reçus 0
Je suis en cours d'élaboration d'un petit script.
Cependant je bloque sur la seconde partie.
En premier niveau je veux lister un emplacement, trier les informations qui m'intéressent et en faire un csv puis les passer dans un tableau pour pouvoir y travailler.
Ce qui donne :
[code:1]New-Item -type directory C:\Doublons-temporaire
Set-location C:\Doublons-temporaire
$chemin = Read-Host \"Veuillez indiquer quel est le chemin UNC du lecteur à analyser?\"
Get-ChildItem $chemin -recurse | Select-Object Name, DirectoryName, Length | Export-Csv C:\Doublons-temporaire\liste.csv -Encoding Unicode
$tableau = Import-Csv .\Liste.csv[/code:1]
Donc j'ai bien mon fichier csv créé avec les propriétés noms, taille et chemin.
Je voudrai comparer tous les noms et tailles des fichiers, si les noms et tailles sont égales, les inscrires dans un autre fichier avec en plus la propriété chemin. (ça fera un fichier avec tous les doublons et leurs chemins)
J'ai essayé en faisant une boucle foreach sur le tableau mais celà ne compare qu'une seule ligne à la fois... Je sais pas trop comment m'y prendre, si quelqu'un a une piste sur la façon de procéder au stade où j'en suis...
Merci ++<br><br>Message édité par: Arnaud, à: 16/06/10 11:23
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Hors Ligne
- Membre elite
- Messages : 226
- Remerciements reçus 0
[string[]]$tab = \"toto\" , \"titi\", \"toto\" , \"tete\" , \"toto\" , \"tata\" , \"titi\"
$tab | foreach {[string[]]$tab_temp = $null ; foreach($objtab in $tab) { if($objtab -eq $_ -and $tab2 -notcontains $objtab) { $tab_temp += $objtab } } if($tab_temp.Count -ge 2) { $tab2 += $tab_temp } }
[/code:1]
Bon j'ai codé ca direct dans la console donc la commande est un \"peu\" lourde.
la commande renvoie un tableau avec :
toto
toto
toto
titi
titi<br><br>Message édité par: bilbao, à: 16/06/10 10:57
Connexion ou Créer un compte pour participer à la conversation.
- Meo
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 5
- Remerciements reçus 0
Cependant étant un débutant total j'aurais quelques questions.
Par rapport au script que tu proposes :
Je vois que tu ajoutes des variables sans les définir avant comme $objtab, peux tu m'expliquer?
Sinon j'ai fait des recherches de mon côté et suis tombé sur la commande Compare-Object, qu'en penses-tu?
Pour finir, je crée un tableau($tableau) avec deux colonnes, une avec des noms(Propriété Name) et l'autre avec leur taille(Propriété Length).
Pour afficher le 4ème nom du tableau je fais : [code:1]$tableau[4].Name[/code:1]
Mais si je veux afficher tous les noms du tableau je fais comment??
Merci encore pour ta réponse et pour ceux qui auront le courage de répondre à mes questions.
++
Message édité par: meogeo, à: 16/06/10 14:43<br><br>Message édité par: meogeo, à: 16/06/10 15:16
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Hors Ligne
- Membre elite
- Messages : 226
- Remerciements reçus 0
$tab2 = $null
#On créer un tableau avec des valeurs au pif, il y a des doublons , 3 toto et 2 titi donc à la fin $tab2 doit contenir 3 toto et 2 titi.
[string[]]$tab = \"toto\" , \"titi\", \"toto\" , \"tete\" , \"toto\" , \"tata\" , \"titi\"
#ici on parcours le tableau
$tab | foreach {
#Ici on remet à zero le tableau temporaire.
[string[]]$tab_temp = $null
#La on va comparer chaque ligne du tableau avec toutes les valeurs du tableau
foreach($objtab in $tab) {
#si on trouve un égalité on range la ligne dans un tableau temporaire.
# le \"notcontains\" évite de comparer 2 fois la même valeur.
if($objtab -eq $_ -and $tab2 -notcontains $objtab)
{
$tab_temp += $objtab
}
}
#Une fois la boucle finit on va regarder ce qu'on à mis dans le tableau temporaire
#si on trouve plus de 2 valeurs on les rangent dans $tab2 cela veut dire
#que l'on à trouvé un doublon, car la valeur existe au moins en double dans le tableau,bref un doublon quoi :«»)
if($tab_temp.Count -ge 2)
{
$tab2 += $tab_temp
}
}[/code:1]
à quoi sert le [string[]] avant les variables? (je comprends pas son utilité?)
Ça sert à initialisé le tableau.
Compare-Object, qu'en penses-tu?
Je ne pense pas que ce soit bon car si j'ai bien compris ton problème, tu compare ton tableau avec lui même pour voire si il y a des doublons dans ton tableau?
Pour afficher Tous les Nom de ton tableau tu à 2 choix :
[code:1]$tableau | select -property Name[/code:1]
ou
[code:1]$tableau | foreach { $_.Name }[/code:1]
Sinon je te conseil d'acheter le livre sur powershell écrit par le créateur de powershell-scripting.com.
Il répond bien mieux que moi à tes questions
Connexion ou Créer un compte pour participer à la conversation.
- Meo
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 5
- Remerciements reçus 0
J'ai déjà acheté le livre ^^
Merci pour tes réponses! Je regarde ça et j'essaie de finaliser mon script que je posterai (si j'y arrive)
++
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
je me permets qq précisions.
meogeo écrit:
PowerShell est un langage dynamique, par défaut il n'est pas nécessaire de définir le type d'une variable.Je vois que tu ajoutes des variables sans les définir avant comme $objtab, peux tu m'expliquer?
meogeo écrit:
Pas tout à fait, c'est un tableau à une dimension contenant des objets possédant des propriétés.Pour finir, je crée un tableau($tableau) avec deux colonnes
bilbao écrit:
Dans ce contexte, il sert à déclarer le type de la variable, l'usage du terme initialiser étant plutôt dédié à la définition de son contenu. Bon, c'est une histoire de sémantique...
Ça sert à initialisé le tableau.à quoi sert le [string[]] avant les variables? (je comprends pas son utilité?)
Les deux instructions suivantes initialisent un tableau, le premier contient des objets de tout type, le second des objets de type string uniquement :
[code:1]
$T=@();$T.GetType()
# IsPublic IsSerial Name BaseType
#
----
# True True Object[] System.Array
[string[]]$T=@();$T.GetType()
# IsPublic IsSerial Name BaseType
#
----
# True True String[] System.Array
[/code:1]
On précise donc le type, l'affectation d'un objet d'un autre type que celui déclaré provoquera une erreur :
[code:1]
[Int[]]$T=@(10)
$T[0]=\"test\"
[/code:1]
Pour le type string PowerShell tente de convertir l'objet avant l'affectation :
[code:1]
[String[]]$T=@(\"Test\"«»)
$T[0].GetType()
$T[0]=10
$T[0].GetType()
[/code:1]
meogeo écrit:
Effectivement, le cmdlet Group-Object est plus approprié pour ton traitement.
Je ne pense pas que ce soit bon...Compare-Object, qu'en penses-tu?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Script recherche doublons