I recently encountered an issue with one of my PowerShell scripts. It was a script to enable litigation hold on all mailboxes in Exchange Online.
I connected to Exchange Online via the usual means below.
$creds = Get-Credential $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $Creds -Authentication Basic -AllowRedirection Import-PSSession $session -AllowClobber
I then attempted to execute the following with no success.
try { Set-Mailbox -Identity $user.UserPrincipalName -LitigationHoldEnabled $true -ErrorAction Stop } catch { Write-Host "ERROR!" -ForegroundColor Red }
As a test I removed the “-ErrorAction Stop” switch and then added the following line to the top of my script.
ErrorActionPreference = 'Stop'
That’s when it would work in Windows PowerShell ISE but not in Windows PowerShell console.
After many hours of troubleshooting I then discovered it was related to the implicit remote session established when connecting to Exchange Online.
To get my try/catch to work correctly I added the following line to the top of my script and all was well again.
$Global:ErrorActionPreference = 'Stop'