물려받은 워크북에서 물려받은 PowerShell 스크립트로 넘어왔더니 옛 친구가 새 옷을 입고 있네요. cmdlet 호출 절반에는 -ErrorAction SilentlyContinue, 나머지에는 2>$null이 붙어 있어요(아마 혹시 몰라서겠죠).

보기보다 나쁜 건 이게 try, catch와 만나는 방식이에요. catch는 종료 오류만 보는데 cmdlet 실패는 대부분 비종료 오류라서, 없는 경로에 대한 Get-Item을 try로 감싸도 그 호출에 -ErrorAction Stop이 없으면 아무것도 안 잡혀요. 빨간 글씨가 보기 싫어서 SilentlyContinue를 붙이고, 전체를 try로 감싸고, 이제 안전하다고 믿는 거죠. (바닥에 난 구멍을 방수포로 덮어 놓은 정도로 안전해요.)

네이티브 프로그램은 또 다른 구멍이에요. $ErrorActionPreference는 기본적으로 그 종료 코드를 아예 안 봐요. 그래서 $LASTEXITCODE를 직접 확인하거나, 7.4 이상이라면 $PSNativeCommandUseErrorActionPreference = $true를 켜서 0이 아닌 종료를 오류로 만들어야 해요.

결국 계속 돌아가는 해법은 VBA 때와 같아요. 실패할 수 있는 호출에 -ErrorAction Stop을 달고, 호출마다 try를 하나씩 두고, 어떤 실패를 예상했는지 말해 주는 catch를 쓰는 거예요.