Question
[Résolu]question sur mon code
- 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 #20167
par Axel
[Résolu]question sur mon code a été créé 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
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.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 10 ans 11 mois #20170
par xyz

Tu cherches un bâton pour te faire battre ?
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Je me pose une question sur mon code
Tu cherches un bâton pour te faire battre ?
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 #20171
par Axel
Réponse de Axel sur le sujet Re:Je me pose une question sur mon code
votre réponse me fait rire
mais je comprends pas forcement le sens
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 10 ans 11 mois #20174
par Philippe
Réponse de Philippe sur le sujet Re:Je me pose une question sur mon code
salut Harcide
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 \"`nVoulez-vous calculer leur MD5 et exporter les informations ?\"
[/code:1]
ici tu demande si on veux le MD5
[code:1]
$rapport | export-csv \"$chemin\rapport_$nomfichier.csv\" -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 \"MAIN\", et plus aucun code hors d'une fonction.
et que tu appel \"main\" à 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
je complèterai la remarque de Laurent par :ma question est donc, est-ce que le md5 ce calcul lors de l'analyse ? ou lors de l'exportation des infos ?
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 \"`nVoulez-vous calculer leur MD5 et exporter les informations ?\"
[/code:1]
ici tu demande si on veux le MD5
[code:1]
$rapport | export-csv \"$chemin\rapport_$nomfichier.csv\" -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 \"MAIN\", et plus aucun code hors d'une fonction.
et que tu appel \"main\" à 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.
- 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 #20175
par Axel
Réponse de Axel sur le sujet Re:Je me pose une question sur mon code
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
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 10 ans 11 mois #20176
par Philippe
Réponse de Philippe sur le sujet Re:Je me pose une question sur mon code
comme t'es sympas je répons court :
[code:1]$rapport | export-csv \"$chemin\rapport_$nomfichier.csv\" -NoTypeInformation -Delimiter ';'[/code:1]
ceci ne fais que écrire le contenu de $rapport dans un fichier !
sais tu ce que fait ta fonction \"new-rapport\" ?
.
[code:1]$rapport | export-csv \"$chemin\rapport_$nomfichier.csv\" -NoTypeInformation -Delimiter ';'[/code:1]
ceci ne fais que écrire le contenu de $rapport dans un fichier !
sais tu ce que fait ta fonction \"new-rapport\" ?
.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.047 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu]question sur mon code