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:
So in etwa hatte ich mir das vorgestellt. Hat da irgendjemand vielleicht einen Lösungsansatz?
MfG
Lucas
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 5119834857
Url: https://administrator.de/contentid/5119834857
Ausgedruckt am: 26.11.2024 um 01:11 Uhr
6 Kommentare
Neuester Kommentar
Moin,
get-item ist der falsche Befehl. Richtig ist get-content. Für das DISM.log etwa so:
hth
Erik
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
Moin,
Gerne.
Works as designed. Für jede Zeile, in der Warning steht, wird das ausgeführt, was Du vorgesehen hast.
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.
Das geht sicherlich. Aber ich habe keine Ahnung, in welchen Stream dsim das schreibt. Den Link solltest Du lesen.
hth
Erik
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
Moin,
Einfach statt
das entsprechende cmdlet nutzen
Das hat vorallem den Vorteil, dass man so auch direkt auf das Ergebnis reagieren kann
Gruß Thomas
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 implementiertDas geht sicherlich. Aber ich habe keine Ahnung, in welchen Stream dsim das schreibt. Den Link solltest Du lesen.
Einfach statt
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
Moin,
Wieder was gelernt. Danke.
Liebe Grüße und ein frohes Neues Jahr
Erik
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 implementiertDas geht sicherlich. Aber ich habe keine Ahnung, in welchen Stream dsim das schreibt. Den Link solltest Du lesen.
Wieder was gelernt. Danke.
Liebe Grüße und ein frohes Neues Jahr
Erik
Danke, dir auch.