Search code examples
windowspowershelldism

How should i handle dism powershell errors?


Hello I tried to handle the errors from dism with cath.. but that didn't work that good. So my question is, how i can improve it.

function dotnet35 () {
    WriteLogNewScirpt "dotnet35"
    WriteLogInstruction "installing .Net 3.5 online"
    $Errorccured=$false
    $Error.Clear()
    try {
    $ErrorActionPreference = 'stop'
        Start-Process -FilePath powershell.exe -ArgumentList {DISM /Online /Enable-Feature /FeatureName:NetFx3 /All} -verb RunAs -WindowStyle Hidden | Out-Default
    } catch {
        WriteLogError ".Net 3.5 could not be installed"
        WriteLogError "$Error"
        $Errorccured=$true  
    }
    if(!$Errorccured) {
        WriteLogPosisitive ".Net 3.5 installed"       
    } else {
        dotnet35offline
    }
}

function dotnet35offline () {
    WriteLogInstruction "installing .Net 3.5 offline"
    $Erroroccured=$false
    $Error.Clear()
    try {
        $ErrorActionPreference = 'stop'
        Start-Process -FilePath powershell.exe -ArgumentList {DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:c:\scripts\sources\features\sxs} -verb RunAs | Out-Default
    } catch {
        WriteLogError ".Net 3.5 could not be installed"
        WriteLogError "$Error"
        $Erroroccured=$true
    }
    if(!$Erroroccured) {
        WriteLogPosisitive ".Net 3.5 konnte offline installiert werden"
    }
} 

Sorry for my translation i translated it quiet fast ^^

thanks in advance


Solution

  • Terminating errors only affect PowerShell functions and exceptions thrown in .NET libraries. If you want to check the result of an external command (such as an executable), you will need to check the $LASTEXITCODE variable, which serves the same purpose as the %ERRORLEVEL% variable in batch scripts. For example:

    Start-Process -FilePath dism.exe -ArgumentList '/Online', '/Enable-Feature', '/FeatureName:NetFx3', '/All' -Verb RunAs -WindowStyle Hidden
    if( $LASTEXITCODE -ne 0 ){
      # Handle the error here
      # For example, throw your own error
      throw "dism.exe failed with exit code ${LASTEXITCODE}"
    }
    

    Also, don't call Out-Default in your code. It's not designed for this use.