Question
[Résolu]les erreurs
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
Réduire
Plus d'informations
- Messages : 176
- Remerciements reçus 0
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
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.
- Philippe
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
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 :
les deux derniers sont explicite !!!
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 :
c'est la conséquence du précédentVous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null
les deux derniers sont explicite !!!
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 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é
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 8 ans 9 mois #20324
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:les erreurs
Salut,
6ratgus écrit:
Sinon un truc rapido : utiliser LiteralPath sur les cmdlets, mais dans cas l'usage des jokers (*.txt) n'est plus possible.
6ratgus écrit:
Pas besoin, voir ceci ou cela .j'ai malheureusement pas le temps demain de faire des recherche approfondie
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.
- Axel
- Auteur du sujet
- Hors Ligne
- Membre elite
Réduire
Plus d'informations
- Messages : 176
- Remerciements reçus 0
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.
- Philippe
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
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 !
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.086 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- [Résolu]les erreurs