none
Script effectuant un sfc /scannow et qui répare les erreurs RRS feed

  • 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
    mercredi 5 février 2020 07:25

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
    jeudi 6 février 2020 09:59
  • 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 :

    1. tu fais tes traitements et tu les mets dans une variable,
    2. 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 :-)


    jeudi 6 février 2020 14:08
  • 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 encore

    EDIT : 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
    jeudi 6 février 2020 14:18