Question [Résolu]question sur mon code

Plus d'informations
il y a 10 ans 11 mois #20167 par Axel
bonjour à tous,

voila, mon code analyse les doublons par taille et ensuite je demande à l'utilisateur si il souhaite calculer le md5 et exporter les informations.

mais lorsque je lance l'analyse sur un dossier (15GigaOctet) avec 25000 fichiers , l'analyse dure 3min
et quand je demande à l'utilisateur de calculer le md5 et exporter les informations ( je fais \"Oui\" ) l'exportation dure à peine 3 secondes. ( je regarde le fichier et les informations sont bien dedans )

J'en déduis que le md5 ce calcul avec l'analyse mais ayant des doutes je préfére connaitre vos avis

voici le code :

[code:1]
#demande de la valeur minimum en octet des fichiers à analyser
$length = read-host \"`nIndiquer la taille minimum pour l'analyse des fichiers en Octet: \"
$taille = $length

#Répertoire par défaut pour l'analyse
$DEFAULT_PATH = \"C:\\"

#L'utilisateur peut choisir le répertoire à analyser
$folder_path = read-host \"`nIndiquer le répertoire à analyser,`n`tpar défaut [$DEFAULT_PATH] \"

if($folder_path)
{
$search = $folder_path
}
else
{
$search = $DEFAULT_PATH
}

$datedebut = get-date
#recherche des fichiers par rapport à la taille
$files = gci $search * -recurse -force|
where-object {$_.length -gt $taille}
$datefin = get-date
$dateresult = $datefin - $datedebut

#création
$doublons = $files|
sort-object length|
group-object length|
where-object {$_.count -gt 1}

function OuiNon{
param(
$Caption,
$Message,
[ValidateSet(\"Oui\",\"Non\"«»)]
$DefaultChoice=\"Non\"
)
$Yes = New-Object System.Management.Automation.Host.ChoiceDescription \"&Oui\"
$No = New-Object System.Management.Automation.Host.ChoiceDescription \"&Non\"
$Choices = [System.Management.Automation.Host.ChoiceDescription[]]($Yes,$No)
$Host.UI.PromptForChoice($Caption,$Message,$Choices,([byte]($DefaultChoice -eq \"Non\"«»)))
}

function Get-FileHash{
[CmdletBinding()]
Param(
[Parameter(Position=0,Mandatory=$true, ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$True)]
[Alias(\"PSPath\",\"FullName\"«»)]
[string[]]$Path,
[Parameter(Position=1)]
[ValidateSet(\"MD5\"«»)]
[string[]]$Algorithm = \"MD5\"
)
process {
foreach ($item in $Path){
$item = (Resolve-Path $item).ProviderPath
$object = New-Object PSObject -Property @{
Path = $item
}
#ouverture du flux
$stream = ([IO.StreamReader]$item).BaseStream
foreach ($Type in $Algorithm){
[string]$hash = -join ([Security.Cryptography.HashAlgorithm]::Create( $Type ).ComputeHash( $stream )|
foreach {\"{0:«»X}\" -f $_ })
$object = Add-Member -InputObject $Object -MemberType NoteProperty -Name $Type -Value $Hash -PassThru
}
$object.pstypenames.insert(0,'System.IO.FileInfo.Hash')
#sortie du Hash et du chemin
Write-Output $object
#fermeture du flux
$stream.Close()
}
}
}

function new-rapport{
param($fichier)
#construit un nouvel objet à partir d'un objet fichier
#par défaut le résultat est émis dans le pipeline
new-object PSObject -property @{
Lastwritetime = $fichier.Lastwritetime;
Length = $fichier.Length;
FullName = $fichier.FullName;
Owner = $fichier.GetAccessControl().Owner;
MD5 = (Get-FileHash $fichier.FullName).MD5
}#new-object
}#new-rapport

#affichage
#boucle sur la collection principale
$rapport = $doublons|
foreach-object{
#boucle sur la collection group de chaque doublon
$_.group|
foreach-object{
#boucle sur la collection de fichiers de chaque group

new-rapport -fichier $_

}#file
}#group

$i = 0
#calcul le nombre de fichiers suspectés
$rapport| foreach{
$i = $i + 1
}

$Oui = 0
$Non = 1
$CHEMIN = \"C:\temp\"
$nomfichier = get-date -format dd.MM.yyyy-HH.mm

if ($i -gt 1)
{
write-host \"`n$dateresult`n\"
write-warning \"$i fichiers suspectés\"
$Choice = OuiNon -message \"`nVoulez-vous calculer leur MD5 et exporter les informations ?\"
}
else
{
Write-Warning \"La recherche n'a pas trouvé de fichier\"
}
if ($Choice -eq $Oui)
{
$d_debut = get-date
$rapport | export-csv \"$chemin\rapport_$nomfichier.csv\" -NoTypeInformation -Delimiter ';'
write-host \"`nLes informations ont été enregistrées.`n\"
write-warning \"$chemin\rapport_$nomfichier.csv\"
$d_fin = get-date
$d_result = $d_fin - $d_debut
write-host \"`n$d_result`n\"
}
[/code:1]

ma question est donc, est-ce que le md5 ce calcul lors de l'analyse ? ou lors de l'exportation des infos ?

Message édité par: Harcide, à: 22/06/15 10:40

Message édité par: Harcide, à: 23/06/15 11:46

Message édité par: Harcide, à: 24/06/15 14:07<br><br>Message édité par: Harcide, à: 25/06/15 15:32

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

Plus d'informations
il y a 10 ans 11 mois #20170 par xyz
Réponse de xyz sur le sujet Re:Je me pose une question sur mon code
:blink:
Tu cherches un bâton pour te faire battre ?

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 11 mois #20171 par Axel
votre réponse me fait rire :lol: mais je comprends pas forcement le sens

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

Plus d'informations
il y a 10 ans 11 mois #20174 par Philippe
salut Harcide

ma question est donc, est-ce que le md5 ce calcul lors de l'analyse ? ou lors de l'exportation des infos ?

je complèterai la remarque de Laurent par :
la réponse est dans le script que TU a fais !

La réponse est plus compliqué qu'elle n'en a l'air !

Dans l'ordre d'exécution :

[code:1]
$doublons = $files |
sort-object length |
group-object length |
where-object {$_.count -gt 1}[/code:1]
ici tu fait la liste des doublons avec $doublons qui ne contient pas de doublons seulement une liste de fichiers de taille identique !


[code:1]
#boucle sur la collection principale
$rapport = $doublons | foreach-object {
#boucle sur la collection group de chaque doublon
$_.group |
foreach-object {
#boucle sur la collection de fichiers de chaque group
new-rapport -fichier $_
}#file
}#group
[/code:1]
ici tu crée un rapport $rapport qui est la liste précédente avec en plus le hash des fichiers


[code:1]
$i = 0
#calcul le nombre de fichiers suspectés
$rapport | foreach {
$i = $i + 1
}
[/code:1]
ici on n'a l'info qui ne sont que suspect
au passage tu peut remplacé ces 4 lignes par :
[code:1]$i = $rapport.count[/code:1]


[code:1]
$Choice = OuiNon -message \&quot;`nVoulez-vous calculer leur MD5 et exporter les informations ?\&quot;
[/code:1]
ici tu demande si on veux le MD5


[code:1]
$rapport | export-csv \&quot;$chemin\rapport_$nomfichier.csv\&quot; -NoTypeInformation -Delimiter ';'
[/code:1]
et enfin la, ... que dire, a toi de deviné !


Laurent te le dira, c'est pas facile d'être débutant et de travaillé comme si tu ne l'était pas ! On y passe tous ! et plus d'un fois dans la vie !
mais si tu peut, organise ton code :
- les conseils des dev sont pas inutile, déclare tes variables en début de script, suivit des fonctions (indispensable pour powershell quelles soit déclaré avant d'être utilisé) puis enfin le corps de ton script.
si ça peut d'aidé, fait comme en C, mes le corps de ton script dans une fonction \&quot;MAIN\&quot;, et plus aucun code hors d'une fonction.
et que tu appel \&quot;main\&quot; à la fin du script. tu retrouvera mieux l'ordre d'exécution du code
- l'indentation va aussi d'aidé a relire to code
- les commentaires bien sûr !
- et enfin le choix des noms des variables

Bon j'ai compris que tu avais peu de temps, alors utilise le pour en gagné !


si ta d'autres questions on est toujours la !<br><br>Message édité par: 6ratgus, à: 17/06/15 11:50

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

Plus d'informations
il y a 10 ans 11 mois #20175 par Axel
merci j'ai fait quelque modif sur mon code je comprends mieux maintenant, je devine donc que lorsque je demande si on veut calculer le md5 et exporter les infos, c'est bien à ce moment que le calcul ce fait mais je trouve ça super rapide :blink:

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

Plus d'informations
il y a 10 ans 11 mois #20176 par Philippe
comme t'es sympas je répons court :

[code:1]$rapport | export-csv \&quot;$chemin\rapport_$nomfichier.csv\&quot; -NoTypeInformation -Delimiter ';'[/code:1]

ceci ne fais que écrire le contenu de $rapport dans un fichier !

sais tu ce que fait ta fonction \&quot;new-rapport\&quot; ?
.

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

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