Question
[Résolu]unique et non unique
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 176
- Remerciements reçus 0
Mais ici j'ai un petit soucis et je n'y arrive pas pourtant je me creuse la tête, j'analyse les fichiers susceptibles d'être des doublons par la taille, je me fiche de toutes les autres tailles unique, ensuite j'analyse leur MD5 et donc parfois j'obtiens des fichiers qui ont la même taille mais qui n'ont pas le même md5 (c'est normal je sais pourquoi).
j'aimerais donc savoir comment faire en sorte de n'obtenir que les fichiers identiques avec leur md5 ?
je suis en V2
voici mon 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
#Déclaration de la Fonction : Select-Folder
function Select-Folder($message = 'Selectionner un répertoire à analyser', $path = 0)
{
$object = new-object -comObject Shell.Application
$folder = $object.BrowseForFolder(0, $message, 0, $path)
if ($folder -ne $null)
{
$folder.self.Path
}
}
#Fin de la déclaration
$folderpath = Select-Folder -path \"C:\\"
$datedebut = get-date
#recherche des fichiers par rapport à la taille
$files = gci $folderpath * -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 Clear-KeyboardBuffer {
while ($Host.UI.RawUI.KeyAvailable)
{$null = $Host.UI.RawUI.ReadKey(\"NoEcho,IncludeKeyDown,IncludeKeyUp\"«»)}
}
function YesNo {
param(
$Caption,
$Message,
[ValidateSet(\"Yes\",\"No\"«»)]
$DefaultChoice=\"No\"
)
Clear-KeyboardBuffer
$Yes = New-Object System.Management.Automation.Host.ChoiceDescription \"&Yes\"
$No = New-Object System.Management.Automation.Host.ChoiceDescription \"&No\"
$Choices = [System.Management.Automation.Host.ChoiceDescription[]]($Yes,$No)
$Host.UI.PromptForChoice($Caption,$Message,$Choices,([byte]($DefaultChoice -eq \"no\"«»)))
}
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
#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
}
$Yes = 0
$No = 1
if ($i -gt 1)
{
write-host \"$dateresult\"
$Choice = YesNo -message \"`n$i fichiers suspectés, voulez-vous les afficher ?\"
}
else
{
write-host \"`nIl n'y a pas de doublon`n\"
}
if ($Choice -eq $Yes)
{
$rapport | format-table
$Choice = YesNo -message \"`n$j fichiers retenus , voulez-vous calculer leur MD5 ?\"
if ($Choice -eq $Yes)
{
$d_debut = get-date
$rapport | Get-FileHash
$d_fin = get-date
$d_result = $d_fin - $d_debut
write-host \"$d_result\"
$Choice = YesNo -message \"`nVoulez-vous exporter les informations ?\"
if ($Choice -eq $Yes)
{
$rapport | export-csv \"C:\Temp\RapportFiles.csv\" -NoTypeInformation -Delimiter ';'
write-host \"Les informations ont été enregistrées dans C:\Temp\RapportFiles.csv\"
}
}
}
[/code:1]
PS : j'espère être compréhensible dans ma description<br><br>Message édité par: Harcide, à: 18/06/15 09:42
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Spécifier correctement n'est pas donné à tout le monde, t'inquiètePS : j'espère être compréhensible dans ma description
Harcide écrit:
Tu veux dire ceux dont la taille ET le md5 sont identique ?j'aimerais donc savoir comment faire en sorte de n'obtenir que les fichiers identiques avec leur md5 ?
Le soucis est que ton objet ne porte pas cette information...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 176
- Remerciements reçus 0
Tu veux dire ceux dont la taille ET le md5 sont identique ?
c'est exact, oui je sais que mon objet n'apporte pas cette information, je suis perdu et submergé par mon code en réalité
d'ailleurs je suis en train de lire votre tuto sur les objets<br><br>Message édité par: Harcide, à: 10/06/15 14:11
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Alors ajoute la comme indiqué dans un de mes posts d'hier concernant la fonction new-rapport.c'est exact, oui je sais que mon objet n'apporte pas cette information
Vérifie le résultat pour qq fichiers.
Une fois ceci fait, tu repostes uniquement le code de la fonction modifiée.
Harcide écrit:
'Perdu' je veux bien le croire pour un débutant, 'submergé' je te conseille l'achat d'une bouée, insubmersible tu seras.<br><br>Message édité par: Laurent Dardenne, à: 10/06/15 14:40je suis perdu et submergé par mon code en réalité
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 176
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Modifie celle existante.je dois faire une nouvelle fonction ou modifié la même ?
Par principe on défini une fonction par objet à créer, d'où l'existence du cmdlet New-Object.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu]unique et non unique