Question
[Résolu]unique et non unique
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 176
- Remerciements reçus 0
il y a 10 ans 11 mois #20018
par Axel
Réponse de Axel sur le sujet Re:unique et non unique
j'ai pas compris la question 
je ferais une proposition de mon nouveau programme demain ça marche ?
je ferais une proposition de mon nouveau programme demain ça marche ?
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 10 ans 11 mois #20019
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:unique et non unique
Harcide écrit:
Ton pb actuel est-il le dernier ou tu dois ajouter d'autres traitement ?j'ai pas compris la question
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 176
- Remerciements reçus 0
il y a 10 ans 11 mois #20020
par Axel
Réponse de Axel sur le sujet Re:unique et non unique
oui je pense que c'est le dernier traitement, j'aurais fait le plus gros ensuite j'aurai surement des réglages à faire, des améliorations, des ptits truc.
Connexion ou Créer un compte pour participer à la conversation.
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 176
- Remerciements reçus 0
il y a 10 ans 11 mois #20021
par Axel
Réponse de Axel sur le sujet Re:unique et non unique
mais même si je modifie la fonction, j'obtiendrai toujours les 3 différents non ?
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 10 ans 11 mois #20022
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:unique et non unique
Harcide écrit:
Les trois quoi ??mais même si je modifie la fonction, j'obtiendrai toujours les 3 différents non ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 10 ans 11 mois #20023
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:unique et non unique
Une solution, je n'ai laissé que le minimum pour le traitement :
[code:1]
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:«»X0}\" -f $_ })
$null = $stream.Seek(0,0)
$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;
}#new-object
}#new-rapport
$length = read-host \"`nIndiquez la taille minimum en octet utilisé lors de l'analyse des fichiers \"
$taille = $length
$folderpath = 'C:\temp'
#recherche des fichiers par rapport à la taille
$files = gci $folderpath * -force | #-recurse
where-Object{-not $_.PSisContainer}|
Where-Object {$_.length -gt $taille}
#$Choice = YesNo -message \"Voulez-vous calculer le MD5 des fichiers retenus ?\"
#$isMD5=$Choice -eq $Yes
$isMD5=$true
#Contient les fichiers de même taille
$doublons = $files |
Sort-Object length |
Foreach {
Write-Warning \"file : $($_.fullname)\"
if ($isMD5)
{
try {
$Hash=(Get-FileHash $_.FullName).MD5
Write-Warning \"file : $($_.fullname) $hash\"
} catch {
Write-error $_
$Hash=$null
}
#Si demandé, ajoute la propriété MD5 à chaque objet fichier
Add-Member -InputObject $_ -MemberType NoteProperty -Name MD5 -Value $Hash
}
Write-Output $_
}|
Group-Object length |
Where-Object {$_.count -gt 1}
#En deux passes, car le MD5 est nécessaire pour ce traitement
if ($isMD5)
{
#Contient les fichiers de même taille ayant un MD5 identique
$Identiques= $doublons|
Where-Object {
#Fichiers de même taille
$Current=$_.Group
#Mémorise un MD5, le premier
$FileHash=$Current[0].MD5
#Tous les MD5 doivent être identique
$Current.Count -eq ($Current.MD5 -eq $FileHash).Count
}
}
else
{
#Contient les fichiers de même taille
#peut importe leur MD5
#La propriété MD5 n'est donc pas créée
$Identiques=$Doublons
}
$rapport = $Identiques |
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]
Pour info, la fonction Get-FileHash ne gère pas les fichiers comportant les caractères '' ( jokers spécifiques à Powershell).
Dans ce cas le MD5, s'il est demandé vaut $null, donc tous les fichiers de même taille dont le MD5 est $null seront sélectionnés dans le rapport final.
Je n'ai pas le temps d'adapter le code de la fonction Get-FileHash.
Enfin je te laisse tester, je te dirais bien d'automatiser ces tests, mais je vais m'arrêter là
[code:1]
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:«»X0}\" -f $_ })
$null = $stream.Seek(0,0)
$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;
}#new-object
}#new-rapport
$length = read-host \"`nIndiquez la taille minimum en octet utilisé lors de l'analyse des fichiers \"
$taille = $length
$folderpath = 'C:\temp'
#recherche des fichiers par rapport à la taille
$files = gci $folderpath * -force | #-recurse
where-Object{-not $_.PSisContainer}|
Where-Object {$_.length -gt $taille}
#$Choice = YesNo -message \"Voulez-vous calculer le MD5 des fichiers retenus ?\"
#$isMD5=$Choice -eq $Yes
$isMD5=$true
#Contient les fichiers de même taille
$doublons = $files |
Sort-Object length |
Foreach {
Write-Warning \"file : $($_.fullname)\"
if ($isMD5)
{
try {
$Hash=(Get-FileHash $_.FullName).MD5
Write-Warning \"file : $($_.fullname) $hash\"
} catch {
Write-error $_
$Hash=$null
}
#Si demandé, ajoute la propriété MD5 à chaque objet fichier
Add-Member -InputObject $_ -MemberType NoteProperty -Name MD5 -Value $Hash
}
Write-Output $_
}|
Group-Object length |
Where-Object {$_.count -gt 1}
#En deux passes, car le MD5 est nécessaire pour ce traitement
if ($isMD5)
{
#Contient les fichiers de même taille ayant un MD5 identique
$Identiques= $doublons|
Where-Object {
#Fichiers de même taille
$Current=$_.Group
#Mémorise un MD5, le premier
$FileHash=$Current[0].MD5
#Tous les MD5 doivent être identique
$Current.Count -eq ($Current.MD5 -eq $FileHash).Count
}
}
else
{
#Contient les fichiers de même taille
#peut importe leur MD5
#La propriété MD5 n'est donc pas créée
$Identiques=$Doublons
}
$rapport = $Identiques |
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]
Pour info, la fonction Get-FileHash ne gère pas les fichiers comportant les caractères '' ( jokers spécifiques à Powershell).
Dans ce cas le MD5, s'il est demandé vaut $null, donc tous les fichiers de même taille dont le MD5 est $null seront sélectionnés dans le rapport final.
Je n'ai pas le temps d'adapter le code de la fonction Get-FileHash.
Enfin je te laisse tester, je te dirais bien d'automatiser ces tests, mais je vais m'arrêter là
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.048 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu]unique et non unique