Question [Résolu]les erreurs

Plus d'informations
il y a 8 ans 9 mois #20316 par Axel
[Résolu]les erreurs a été créé par Axel
bonjour à tous,

lorsque j'utilise mon code pour détecter des doublons sur des serveurs j'obtiens 4 types d'erreurs :

[code:1]Plusieurs surcharges ambiguës trouvées pour « ComputeHash » et le nombre d'arguments « 1 »[/code:1]

[code:1]Plusieurs surcharges ambiguës trouvées pour « ComputeHash » et le nombre d'arguments « 1 »
+
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null[/code:1]

[code:1]Le chemin d'accès spécifié, le nom de fichier ou les deux sont trop longs
Le nom de fichier qualifié complet doit comprendre moins de 260 caractères et le nom du répertoire moins de 248 caractères[/code:1]

[code:1]Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus[/code:1]

j'aimerai que ces erreurs ne s'affichent pas dans la console mais sur un fichier .log par exemple.

je sais que je dois utiliser le try/catch/finally mais aucunes idées de comment je dois utiliser cela.

voici mon code :

[code:1]
#Déclaration des variables

#Choix de l'algorithme
$ALGO = \"MD5\"
#Répertoire par défaut pour le rapport
$CHEMIN_RAPPORT = \"C:\temp\"
#Répertoire par défaut pour l'analyse
$DEFAULT_PATH = \"C:\\"
#Taille minimum par défaut pour l'analyse, vous pouvez changer la taille, exemple : 10/100/1000
$DEFAULT_LENGTH = \"1\"
#Unité minimum par défaut pour l'analyse, vous pouvez changer l'unité, rappel : KB/MB/GB/TB/PB
$DEFAULT_UNITE = \"MB\"
#Unité minimum par défaut du switch, vous pouvez changer l'unité mais pas la taille, rappel : KB/MB/GB/TB/PB
$DEFAULT_SWITCH = 1MB

#Boite de dialogue avec comme boutons reponses oui/non
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\"«»)))
}

#Fonction de calcul du MD5
function Get-FileHash{
[CmdletBinding()]
Param(
[Parameter(Position=0,Mandatory=$true, ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$True)]
[Alias(\"PSPath\",\"FullName\"«»)]
[string[]]$Path,
[Parameter(Position=1)]
[string[]]$Algorithm = $ALGO
)

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

# Partie principale du script
function main {

$Oui = 0
$Non = 1

#L'utilisateur peut définir l'unité minimum des fichiers à analyser
$unite = read-host \"Veuillez choisir votre unité de stockage,`npar exemple [KB/MB/GB/TB/PB],`n`tpar défaut [$DEFAULT_UNITE]\"

#L'utilisateur peut définir la taille minimum des fichiers à analyser
$length = read-host \"`nIndiquer la taille minimum des fichiers à analyser,`npar exemple [10/100/1000],`n`tpar défaut [$DEFAULT_LENGTH] \"

$Size = [int]$length
$def_length = [int]$DEFAULT_LENGTH

switch ($unite)
{
\"KB\" {$choice = $Size *1KB}
\"MB\" {$choice = $Size *1MB}
\"GB\" {$choice = $Size *1GB}
\"TB\" {$choice = $Size *1TB}
\"PB\" {$choice = $Size *1PB}
default {$choice = $def_length * $DEFAULT_SWITCH}
}

#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 supérieur à la taille indiquée
$files = Get-ChildItem $search * -recurse -force | where-object {$_.length -gt $choice}
$i = 0 + $files.count

$datefin = get-date
$dateresult = $datefin - $datedebut
write-host \"`n$dateresult`n\"
write-warning \"$i fichiers trouvés au dessus de la taille minimum indiquée précédement\"

if ($files.Count -gt 0)
{
# Suivant le choix de l'utilisateur exporte les informations dans un fichier rapport daté
$Choix = OuiNon -message \"`nVoulez-vous calculer le MD5 et exporter les informations ?\"
$d_debut = get-date
$isMD5=$True

if ($Choix -eq $Oui) {
#Contient les fichiers de même taille
$fichiers_suspects = $files |
Sort-Object length |
Foreach {
if ($isMD5)
{
try {
$Hash=(Get-FileHash $_.FullName).MD5
} 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}

if ($isMD5)
{
#Contient les fichiers de même taille ayant un MD5 identique
$identiques = $fichiers_suspects|
Where-Object {
#Fichiers de même taille
$Current = $_.Group
#Mémorise un MD5, le premier
$FileHash = $Current[0].MD5
#Construit un tableau contenant tous les MD5
$AllMD5 = $Current|Foreach {$_.MD5}
#Tous les MD5 doivent être identique
$Current.Count -eq ($AllMD5 -eq $FileHash).Count
}
}
else
{$identiques=@()}

$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 $_
}# new-rapport
} # group
$nomfichier = get-date -format dd.MM.yyyy-HH.mm
$rapport | export-csv \"$CHEMIN_RAPPORT\rapport_$nomfichier.csv\" -NoTypeInformation -Delimiter ';'
write-host \"`nLes informations ont été enregistrées.`n\"
write-warning \"$CHEMIN_RAPPORT\rapport_$nomfichier.csv\"
$j = $rapport.Count
$d_fin = get-date
$d_result = $d_fin - $d_debut
write-host \"`n$d_result`n\"
write-warning \"$j fichiers retenus\"
}
}
else
{Write-Warning \"La recherche n'a pas trouvée de fichier\"}
}
# Fonction principale du script
main
[/code:1]

Message édité par: Harcide, à: 25/06/15 12:01<br><br>Message édité par: Harcide, à: 26/06/15 10:25

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

Plus d'informations
il y a 8 ans 9 mois #20322 par Philippe
Réponse de Philippe sur le sujet Re:les erreurs
salut Harcide

j'ai le même problème sur certains fichiers je n'ai pas encore eu le temps de regardé de plus prés

je te tien au courant sauf si quelqu'un d'autre à une idée

je te conseille aussi de donné le message d'erreur entier pour que quelqu'un de passage puisse retrouvé la ligne suspecté d'avoir une erreur !
[code:1]Plusieurs surcharges ambiguës trouvées pour « ComputeHash » et le nombre d'arguments « 1 ».
Au caractère G:\Powershell\compil de scripts\recherche donblons.ps1:44 : 17
+ [string]$hash = -join ([Security.Cryptography.HashAlgorithm]::Cr ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:«») [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest[/code:1]

Pour ce message :

Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null

c'est la conséquence du précédent

les deux derniers sont explicite !!!

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

Plus d'informations
il y a 8 ans 9 mois #20323 par Philippe
Réponse de Philippe sur le sujet Re:les erreurs
il semble que le problème soit le nom du fichier !!
il ne faut pas de caractères spéciaux du type crochet [] !!

cherche sur le forum ou le net une alternative à cette situation
le cas c'est déjà présenté pour d'autre situation

j'ai malheureusement pas le temps demain de faire des recherche approfondie :( c'est pas facile de travaillé

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

Plus d'informations
il y a 8 ans 9 mois #20324 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:les erreurs
Salut,
6ratgus écrit:

j'ai malheureusement pas le temps demain de faire des recherche approfondie

Pas besoin, voir ceci ou cela .

Sinon un truc rapido : utiliser LiteralPath sur les cmdlets, mais dans cas l'usage des jokers (*.txt) n'est plus possible.

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 9 mois #20328 par Axel
Réponse de Axel sur le sujet Re:les erreurs
merci pour les infos

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

Plus d'informations
il y a 8 ans 9 mois #20337 par Philippe
Réponse de Philippe sur le sujet Re:les erreurs
Merci Laurent pour les infos

Harcide, j'espère que t'a pu faire les modif pour ta fonctions de hash !

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

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