Synopsis #
Kompetenz bei der Diagnose eines technischen Problems hängt nicht nur davon ab, eine große Anzahl an Tests/Checks in Petto zu haben, sondern auch vom Bewusstsein für die Abhängigkeiten zwischen einzelnen Problen. Daraus ergibt sich eine logische Hierarchie, nach der Tests durchgeführt werden sollten. Das Ziel ist, die kürzeste und aussagekräftigste Charakterisierung des vorliegenden Problems zu liefern.
Wenn z.B. die Festplatte voll ist, sind weitere Prüfungen auf eine fehlerhafte Anwendung sinnlos. Wenn der Client-Agent nicht läuft, müssen Sie nicht nach fehlenden Updates suchen.
PSDiag organisiert Tests in Ebenen einer Hierarchie mithilfe einer verschachtelten PowerShell-Hashtabelle. Da die Tests lediglich PowerShell-Skriptblöcke sind, profitieren Sie automatisch von Syntaxprüfung und -hervorhebung in Ihrem bevorzugten Code-Editor.
@{
# check system PATH
'path_exists' = { Test-Path $env:windir }
# check free RAM
'mem_free' = { (Get-WmiObject Win32_OperatingSystem).FreePhysicalMemory -gt 100MB }
# sub-section
'service' = @{
# service exists
'exist' = {
if ( Get-Service -Name 'svcname' ) { $true }
else { 'not found' }
}
# sub-sub-section
'file' = @{
# last modification
'age' = { ( (Get-Date) - $myfile.LastWriteTime ).TotalMinutes -le 10 }
}
}
}
Angenommen der Hauptspeicher ist voll: Das Resultat ist dann :mem_free. Der spätere Test service:exist und file:age wird weggelassen, weil er vom vorherigen abhängt.
Im Gegensatz dazu, wenn alle vorherigen Tests ok sind aber $myfile älter als 10 minuten, dann ist das einzige Resultat file:age.
Regeln für das Schreiben von Tests #
A test is a name/value pair where the value is a script block
'test name' = { ... }
A sub-section of tests is a name/value pair where the value is a hash table
'section name' = @{ ... }
A sub-section is only processed after all tests of the current sections are successful.
- Ein Test ist erfolgreich, wenn der Skriptblock
[bool] $truezurückgibt. - Ein Test schlägt fehl, wenn der Skriptblock
[bool] $false,$nulloder ein anderes Objekt zurückgibt. Das zurückgegebene Objekt wird in der Ausgabe als Zeichenfolge an den Testnamen angehängt. - Ein Test gilt ebenfalls als fehlgeschlagen, wenn der Skriptblock eine Ausnahme auslöst. Die Beschreibung der Ausnahme wird der Ausgabe angehängt.
- Wenn Ihr Test die Variable $v definiert, wird deren Inhalt im -Verbose-Modus an die Ausgabe angehängt.
- Rufen Sie in Ihrem Skriptblock kein
breakin your script block since this will terminate all tests below the current level. - Verwenden Sie in Ihrem Skriptblock kein
throwsondern eher if/then/else Strukturen. Nutzen sie Ausnahmebehandlung nur für unerwartete Situationen. - Eine Variable, die Sie in einem Test deklarieren, steht in den nachfolgenden Tests zur Verfügung.
- Tests und Unterabschnitte derselben Ebene werden in alphabetischer Reihenfolge ausgeführt – nicht unbedingt in der Reihenfolge, in der sie in der Datei definiert sind. Definieren Sie Ihre Tests zur Vermeidung von Verwirrung in alphabetischer Reihenfolge.
- Abschnitte können optional gemacht werden, indem ein spezieller Testname
'?'verwendet wird. Der Abschnitt wird übersprungen, wenn dieser Test fehlschlägt.
