Question Script recherche doublons

Plus d'informations
il y a 12 ans 5 mois #7156 par Meo
Script recherche doublons a été créé par Meo
Bonjour,
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.

Plus d'informations
il y a 12 ans 5 mois #7159 par Arthur
Réponse de Arthur sur le sujet Re:Script recherche doublons
[code:1]$tab2 = $null
[string[]]$tab = \&quot;toto\&quot; , \&quot;titi\&quot;, \&quot;toto\&quot; , \&quot;tete\&quot; , \&quot;toto\&quot; , \&quot;tata\&quot; , \&quot;titi\&quot;
$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 \&quot;peu\&quot; lourde. :whistle:

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.

Plus d'informations
il y a 12 ans 5 mois #7161 par Meo
Réponse de Meo sur le sujet Re:Script recherche doublons
Bonjour et merci pour la réponse.
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.

Plus d'informations
il y a 12 ans 5 mois #7162 par Arthur
Réponse de Arthur sur le sujet Re:Script recherche doublons
[code:1]#$Tab2 est le tableau qui contient le resultat final on l'initialise avec $null ( ce n'est pas obligatoire)
$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 = \&quot;toto\&quot; , \&quot;titi\&quot;, \&quot;toto\&quot; , \&quot;tete\&quot; , \&quot;toto\&quot; , \&quot;tata\&quot; , \&quot;titi\&quot;
#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 \&quot;notcontains\&quot; é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 :P

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 5 mois #7163 par Meo
Réponse de Meo sur le sujet Re:Script recherche doublons
Bonjour,
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)
:P
++

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 5 mois #7164 par Laurent Dardenne
Salut,
je me permets qq précisions.
meogeo écrit:

Je vois que tu ajoutes des variables sans les définir avant comme $objtab, peux tu m'expliquer?

PowerShell est un langage dynamique, par défaut il n'est pas nécessaire de définir le type d'une variable.
meogeo écrit:

Pour finir, je crée un tableau($tableau) avec deux colonnes

Pas tout à fait, c'est un tableau à une dimension contenant des objets possédant des propriétés.
bilbao écrit:

à quoi sert le [string[]] avant les variables? (je comprends pas son utilité?)

Ça sert à initialisé le tableau.

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...

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]=\&quot;test\&quot;
[/code:1]
Pour le type string PowerShell tente de convertir l'objet avant l'affectation :
[code:1]
[String[]]$T=@(\&quot;Test\&quot;«»)
$T[0].GetType()
$T[0]=10
$T[0].GetType()
[/code:1]

meogeo écrit:

Compare-Object, qu'en penses-tu?

Je ne pense pas que ce soit bon...

Effectivement, le cmdlet Group-Object est plus approprié pour ton traitement.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.055 secondes
Propulsé par Kunena