yuuto.lucas
Goto Top

DISM und SFC in Powershell Script

Hallo,

zuvor noch einmal kurz gesagt. Ich ein ein absoluter Anfänger was Programmieren angeht und erst recht wenn es sich hier um Powershell handelt. Aber Naja, dafür gibt es ja solche Foren hier.

Okay, ich halte es einfach mal kurz. Ich schreibe gerade ein "Wartungsscript" mit Powershell. Dieses wird Monatlich an den Clients gestartet und folgendes soll dabei passieren:

Script erstellt einen Restore Punkt.
Script führt DISM Scanhealth und danach SFC /scannow durch.
Script löscht ungebrauchte Temp Dateien.

Jetzt das Problem. Ich hänge nämlich beim zweiten Punkt fest und finde auf Google einfach nicht das was ich suche.

Ich führe sowohl DISM als auch SFC ganz normal durch und hole mir danach die Log Files. Nur wie lasse ich jetzt Powershell in diese Log Files schauen um eine Abfrage daraus zu bauen?

Ich Kopiere das Grundgerüst einfach mal hier unten drunter:

$Scan1 = Start-Process -FilePath "C:\Windows\System32\Dism.exe" -ArgumentList '/online /cleanup-image /scanhealth' -Wait -Verb RunAs -WindowStyle Normal  
$Scan2 = Start-Process -FilePath "C:\Windows\System32\sfc.exe" -ArgumentList '/scannow' -Wait -Verb RunAs -WindowStyle Normal  

Invoke-Command $Scan1
Invoke-Command $Scan2

$DISMscan = Get-Item C:\Windows\Logs\DISM\dism.log
$SFCscan = Get-Item C:\Windows\Logs\CBS\CBS.log



if ($DISMscan.Name -match "Warning"){  
   Write-Host -ForegroundColor Red "A warning accured, please check the LogFile to identify the problem"  
}
else {
    Write-Host -ForegroundColor Cyan "Please countinue the process..."  
}

if ($SFCscan.Name -match "Repair complete"){  
    Write-Host -ForegroundColor Cyan "Repair is now completed, countinuing process..."  
}
else {
    Write-Host -ForegroundColor Red "Repair not completed, please look after problem before countinuing..."  
}

So in etwa hatte ich mir das vorgestellt. Hat da irgendjemand vielleicht einen Lösungsansatz?

MfG
Lucas

Content-ID: 5119834857

Url: https://administrator.de/contentid/5119834857

Ausgedruckt am: 26.11.2024 um 01:11 Uhr

erikro
erikro 28.12.2022 um 11:20:13 Uhr
Goto Top
Moin,

get-item ist der falsche Befehl. Richtig ist get-content. Für das DISM.log etwa so:

$file = Get-Content C:\Windows\Logs\DISM\dism.log
$date = get-date -format "yyyy-MM-dd"  
foreach($line in $file) {
    if(($line -match "^$date.*") -and ($line -match ".*Warning.*")) {  
        # Mach was mit der Zeile
        }
}

hth

Erik
Yuuto.Lucas
Yuuto.Lucas 29.12.2022 um 08:43:39 Uhr
Goto Top
Moin Erik,

das hat mir soweit schon mal weiter geholfen vielen Dank.
Jetzt steh ich nur vor folgendem Problem.

Wenn ich mich auf die Hauptlogs beziehe wird er mir immer wieder die Warnungen und die Fehler entgegen werfen. Also, beim Test hat er mir dann auch einfach mehrfach hintereinander immer wieder die Meldung ausgegeben, die bei einem Fehler ausgegeben werden soll.

Ich hab also an eine Alternative gedacht, wie wäre es wenn ich den Prozess selbst in einer Lokalen Log Datei speichern lasse und mich dann später in der Abfrage auf diese Log beziehe.
Hab da auch schonmal ungefähr was überlegt...

$logFile = "C:\Temp\SystemScans.log"  

Clear-Content -Path $logFile

$dismOutput = Dism /Online /Cleanup-Image /ScanHealth

Add-Content -Value "ScanHealth Results:" -Path $logFile  
Add-Content -Value $dismOutput -Path $logFile

$sfcOutput = sfc /scannow

Add-Content -Value "SFC Results:" -Path $logFile  
Add-Content -Value $sfcOutput -Path $logFile

Write-Host "Scans complete. Results can be found in the log file at $logFile"  

Problem hierbei, hab ich natürlich vorher nicht nachgedacht... Ja der schreibt etwas in die selbst angelegte Log File. Aber nur den Ablauf. Also die Grafische Darstellung des Prozentbalkens. Er führt also den Befehl einfach nur in der Text Datei aus.

Hat noch jemand von euch einen Lösungsansatz wie ich die Befehle mit Ladebalken auf dem Monitor hab und er einfach nur das Protokolliert was er sonst auch in seine eigene Log File schreibt?

Ich hoffe ich hab jetzt überhaupt verständlich ausgedrückt was ich hier brauche / haben will..

MfG
Lucas
erikro
erikro 29.12.2022 um 09:50:47 Uhr
Goto Top
Moin,

Zitat von @Yuuto.Lucas:
das hat mir soweit schon mal weiter geholfen vielen Dank.

Gerne.

Wenn ich mich auf die Hauptlogs beziehe wird er mir immer wieder die Warnungen und die Fehler entgegen werfen. Also, beim Test hat er mir dann auch einfach mehrfach hintereinander immer wieder die Meldung ausgegeben, die bei einem Fehler ausgegeben werden soll.

Works as designed. Für jede Zeile, in der Warning steht, wird das ausgeführt, was Du vorgesehen hast.

Ich hab also an eine Alternative gedacht, wie wäre es wenn ich den Prozess selbst in einer Lokalen Log Datei speichern lasse und mich dann später in der Abfrage auf diese Log beziehe.

Das macht die Sache nicht besser. Dann hättest Du eine Kopie des Logs, in der das gleiche steht. Wenn Du nur eine Zeile Warnmeldung haben willst, dann musst Du das abfangen. Etwa so.

$file = Get-Content C:\Windows\Logs\DISM\dism.log
$date = get-date -format "yyyy-MM-dd"  
$counter = 0
foreach($line in $file) {
    if(($line -match "^$date.*") -and ($line -match ".*Warning.*")) {  
        if($counter -eq 0) {
                 # Gib die Meldung aus
        }
        $counter++
        }
}
write-host "Es sind $counter Fehler aufgetreten."  

Hat noch jemand von euch einen Lösungsansatz wie ich die Befehle mit Ladebalken auf dem Monitor hab und er einfach nur das Protokolliert was er sonst auch in seine eigene Log File schreibt?

Das geht sicherlich. Aber ich habe keine Ahnung, in welchen Stream dsim das schreibt. Den Link solltest Du lesen.

hth

Erik
TK1987
Lösung TK1987 30.12.2022 aktualisiert um 20:48:32 Uhr
Goto Top
Moin,

Zitat von @erikro:
Das geht sicherlich. Aber ich habe keine Ahnung, in welchen Stream dsim das schreibt. Den Link solltest Du lesen.
DISM ist als Modul in Powershell implementiert

Einfach statt
Zitat von @Yuuto.Lucas
$dismOutput = Dism /Online /Cleanup-Image /ScanHealth
das entsprechende cmdlet nutzen
$dismOutput = Repair-WindowsImage -Online -ScanHealth

Das hat vorallem den Vorteil, dass man so auch direkt auf das Ergebnis reagieren kann
switch ($dismOutput.ImageHealthState){
  "Healthy"       {  
    # Image ist gesund
  }
  "Repairable"    {  
    # Image ist fehlerhaft, kann aber repariert werden
  }
  "NonRepairable" {  
    # Image ist fehlerhaft und nicht reparierbar
  }
}

Gruß Thomas
erikro
erikro 02.01.2023 um 09:40:13 Uhr
Goto Top
Moin,

Zitat von @TK1987:
Zitat von @erikro:
Das geht sicherlich. Aber ich habe keine Ahnung, in welchen Stream dsim das schreibt. Den Link solltest Du lesen.
DISM ist als Modul in Powershell implementiert

Wieder was gelernt. Danke.

Liebe Grüße und ein frohes Neues Jahr

Erik
TK1987
TK1987 02.01.2023 um 14:12:24 Uhr
Goto Top
Zitat von @erikro:
Liebe Grüße und ein frohes Neues Jahr
Danke, dir auch.