Auteur de questions
Script effectuant un sfc /scannow et qui répare les erreurs

Question
-
Bonjour à tous,
Je m'intéresse de plus en plus au powershell, et j'aimerai écrire un script qui :
- Lance un sfc /scannow sur la machine,
- Qui, en fonction du résultat :
- Pas d'erreur, fin du script -> Log envoyé sur un partage réseau
- Erreur "classique" corrigeable directement par sfc /scannow -> Log envoyé sur le réseau
- Erreur non corrigeable par sfc /scannow, le script lance la commande "Dism /Online /Cleanup-Image /CheckHealth" (qui envoie le résultat dans un log), puis lance la commande "Dism /Online /Cleanup-Image /ScanHealth" (qui envoie le résultat dans le même log) et enfin lance la commande "DISM /Online /Cleanup-Image /RestoreHealth" et envoie également le résultat dans le même log
Or, je suis bloqué à la première partie.
$result = Start-Process -FilePath "${env:Windir}\System32\SFC.EXE" -ArgumentList '/scannow' | Out-File C:\Users\Users\Desktop\test.txt Write-Host $result if ($result -like "*aucune violation*") { Write-Host "Aucune erreur" else Write-Host "Erreur"}
Je ne récupère rien dans mon fichier, et donc également rien dans ma variable $result.
Pourtant, si je change par :$result = Invoke-Command -ScriptBlock { sfc.exe /scannow } | Out-File C:\Users\USER\Desktop\test.txt Write-Host $result if ($result -like "*aucune violation*") { Write-Host "Aucune erreur" else Write-Host "Erreur"}
J'obtiens bien un résultat mais avec des lettres espacées comme ceci :
"a u c u n e v i o l a t i o n d ' i n t e g r i t e"
Pouvez vous me dire pourquoi je n'ai rien dans ma variable dans le premier cas svp ?
Merci
- Modifié Speeedfan jeudi 6 février 2020 10:37
Toutes les réponses
-
Pour ceux que ça pourrait intéresser, j'ai bien avancé même si ce n'est pas fini et que ça va probablement choqué les pro du powershell que vous êtes, car je suppose qu'il y avait mieux à faire :D
######################################## ####### Définition des variables ####### ######################################## #Définition de la date $date = Get-Date -Format "dd-MM-yyyy" #Récupération du nom de l'ordinateur $computername = $env:COMPUTERNAME #Définition de l'emplacement du rapport $reportpath = "C:\Users\USER\Desktop\Check_Disk_"+"$computername"+"_"+$date+".html" #Récupération de la version de l'OS $OSVersion = (Get-WMIObject win32_operatingsystem).name #Définition du chemin de l'image Windows à utiliser en cas de réparation $WindowsImage = "" if ($OSVersion -like "*Windows 10*") { $WindowsImage = "" } elseif ($OSVersion -like "*Windows Server 2016") { $WindowsImage = "" } elseif ($OSVersion -like "*Windows Server 2012") { $WindowsImage = "" } elseif ($OSVersion -like "*Windows Server 2008*") { $WindowsImage = "" } # Vérification de l'existence ou non du rapport. if((test-path $reportpath) -like $false) { new-item $reportpath -type file } #Variable du rapport et clear du rapport $report = $reportpath #Clear-Content $report # Définition de l'encodage pour supprimer les espaces générés via la commande sfc /scannow $prev = [console]::OutputEncoding [console]::OutputEncoding = [Text.Encoding]::Unicode #Lancement de SFC/Scannow #$result = sfc /scannow | Out-File $reportpath $content = Get-Content $reportpath # Remise de l'encodage d'origine #[console]::OutputEncoding = $prev #Write-Host $result if ($content | Select-String "n’a trouvé aucune violation d’intégrité","any integrity violations") { #Clear-Content $reportpath Add-Content $reportpath "<font face='tahoma' color='#05A211' size='3'><strong>Aucunes erreurs détectées</strong></font>" } elseif ($content | Select-String "des fichiers endommagés et a pu les réparer","found corrupt files and successfully") { #Clear-Content $reportpath Add-Content $reportpath "<br />" Add-Content $reportpath "<font face='tahoma' color='#05A29D' size='3'><strong>Les erreurs ont été corrigées</strong></font>" } elseif ($content | Select-String "mais n'a pas réussi à tous les réparer","found corrupt files but was undable to fix") { Add-Content $reportpath "<br />" Add-Content $reportpath "<font face='tahoma' color='#A21105' size='3'><strong>Traitement des erreurs</strong></font>" Add-Content $reportpath "<br />" Add-Content $reportpath "Exécution de la commande Repair-WindowsImage -Online -ScanHealth" Repair-WindowsImage -Online -ScanHealth | Out-File "C:\Users\USER\Desktop\test.html" Add-Content $reportpath "<br />" Add-Content $reportpath "Résultat : " Add-Content $reportpath -Value (Get-Content "C:\Users\USER\Desktop\test.html") if ($content | Select-String "ImageHealthState : Healthy") { Add-Content $reportpath "<br />" Add-Content $reportpath "<font face='tahoma' color='#05A29D' size='3'><strong>Health status : OK</strong></font>" } elseif ($content | Select-String "ImageHealthState : Repairable") { Add-Content $reportpath "<br />" Add-Content $reportpath "<font face='tahoma' color='#FF6400' size='3'><strong>Health status : Repair need to be done</strong></font>" Add-Content $reportpath "Exécution de la commande Repair-WindowsImage -RestoreHealth -Source install_path -LimitAccess" Repair-WindowsImage -RestoreHealth -Source $WindowsImage -LimitAccess }
- Modifié Speeedfan jeudi 6 février 2020 10:37
-
Bonjour Speedfan
Impec ta solution de contournement sur Sfc.exe. Tout ça parce que c'est une commande DOS qui ne sait gérer que du texte et pas des objects comme Posh.
Quelques remarques mais rien de grave
- $ReportPath : $Home\Desktop\... ainsi peu importe qui lance ça atterrira sur son bureau (Help About_Automatic_Variables)
- $Report, $OSVersio, et d'autres var que tu définies ne sont pas utilisés ... à moins qu'il y ait d'autres morceaux pour le code final.
- au lieu de faire
#Write-Host $result if ($content | Select-String "n’a trouvé aucune violation d’intégrité","any integrity violations") { #Clear-Content $reportpath Add-Content $reportpath "<font face='tahoma' color='#05A211' size='3'><strong>Aucunes erreurs détectées</strong></font>" }
Je te suggère de poser dans une variable comme un fragment HTML
if ($content | Select-String "n’a trouvé aucune violation d’intégrité","any integrity violations") { $IntgrResult = "Aucunes erreurs détectées" | ConvertTo-Html -Fragment }
- tu fais de même pour tous les autres traitement.
- et enfin tu assembles tes morceaux
$Header = @" <Title>Event Log Report</Title>
<style>body { background-color:#E5E4E2; font-family:Monospace; font-size:10pt; }td, th { border:0px solid black; border-collapse:collapse; white-space:pre; }
th { color:white; background-color:black; }
table, tr, td, th { padding: 2px; margin: 0px ;white-space:pre; }
tr:nth-child(odd)
{background-color: lightgray}table { width:95%;margin- margin-bottom:20px;}
h2 { font-family:Tahoma; color:#6D7B8D;}
.footer { color:green; margin- font-family:Tahoma; font-size:8pt; font-style:italic;}
</style>
"@
$report = $Header + $frag1 + $frag2
Regarde cet exemple :
- tu fais tes traitements et tu les mets dans une variable,
- tu assembles les morceaux pour sortir ton rapport.
adding-style-powershell-html-reports
Un truc à ajouter, Tu ajoutes un traitement, puis tu files à la fin et tu ajoutes le morceau ou tu veux.
Naturellement, tu peux ajouter d'autres choses entre tes fragments, comme des titres.
Cordialement
Olivier
Nota : La feuille de style est celle de l'exemple cité. On aime ... ou pas. Il y a plus zoli :-)
-
Salut,
Merci de ton retour !
$ReportPath : $Home\Desktop\... ainsi peu importe qui lance ça atterrira sur son bureau (Help About_Automatic_Variables)
$Report, $OSVersio, et d'autres var que tu définies ne sont pas utilisés ... à moins qu'il y ait d'autres morceaux pour le code final.
Effectivement, ce sont des ajustements que je compte faire une fois terminé.
Pour les variables, elles seront utilisées effectivement ;)
Merci pour le conseil du HTML, je vais essayer cela une fois que le script sera opérationnel !
Pour le moment, je suis bloqué sur cela :
elseif ($content | Select-String "mais n'a pas réussi à tous les réparer","found corrupt files but was unable to fix") {
Parce que le problème, c'est que sur mon PC, ça fonctionne car le fichier est au format ANSI, mais sur les serveurs, le rapport généré est au format unicode et je me retrouve avec ça dans le rapport :
La protection des ressources Windows a trouvé des fichiers endommagés, mais n’a pas réussi à tous les réparer. Des détails sont inclus dans le journal
Donc le script ne fonctionne plus.
Je cherche une regex pour matcher "mais n'a pas réussi à tous les réparer" sur plusieurs lignes, mais je ne trouve pas.
Si quelqu'un à une idée..
merci encoreEDIT : Je pense avoir trouvé une solution. Rajouter -Encoding UTF8 après le Out-File
Je test !Ca fonctionne pas apparemment :/
- Modifié Speeedfan jeudi 6 février 2020 14:38