## TL;DR

Make the script fail loudly: set $ErrorActionPreference = 'Stop' at the top, wrap risky calls in try/catch, and end the script with an explicit nonzero exit when something went wrong (e.g. exit 1 in the catch block).

## Steps

1. Never trust the raw exit code of a -file PowerShell step. Make the script fail loudly: set $ErrorActionPreference = 'Stop' at the top, wrap risky calls in try/catch, and end the script with an explicit nonzero exit when something went wrong (e.g. exit 1 in the catch block). Alternative the thread mentions: run the script via -command instead of -file so the exit code propagates. Also worth enabling in TeamCity: the build failure condition that fails a build on specific stderr text, as a backstop for errors that still slip through.

## When to use

You are seeing this: Never trust the raw exit code of a -file PowerShell step. Use this skill when you run into "TeamCity PowerShell steps report success when the script actually failed".

## When not to use

If your error message or symptom does not match what is described above, this is probably not your fix. Search for your exact error text instead of forcing this one to fit.

## Versions

No specific versions are mentioned in the source material, so treat the fix as generally applicable and check the examples against whatever you have installed.

## Why this happens

The original report does not dig into a root cause. It documents the symptom and the fix that resolved it.

## Edge cases

- Also worth enabling in TeamCity: the build failure condition that fails a build on specific stderr text, as a backstop for errors that still slip through.
