I am wondering if the Try / Catch below works or should I use an IF ($problem) instead of the Try/Catch
Try {
New-Item -Path C:\reports -ItemType Directory -ErrorAction SilentlyContinue -ErrorVariable Problem -Force
}
Catch {
Write-Warning "Problem with C:\Report directory. Unable to create report $Type of $SourceEmail $Flag $DestinationEmail"
}
I am checking to see if a directory exists and if not attempt to create the directory.
I am not sure if because I am using -ErrorAction SilentlyContinue -ErrorVariable Problem the try/catch is not working as intended?
Altenative
New-Item -Path C:\reports -ItemType Directory -ErrorAction SilentlyContinue -ErrorVariable Problem -Force
If ($Problem) {
Write-Warning "Problem trying to create C:\Reports."
}
CodePudding user response:
I am checking to see if a directory exists and if not attempt to create the directory.
New-Item's -Force switch can be used to create a directory unless it already exists; a System.IO.DirectoryInfo object describing either the preexisting directory or the newly created directory is returned (note that -Force also creates parent directories on demand).
Since you're already using -Force, this means that only a true error condition is reported, such as a lack of permissions.
In the simplest case, you can simply abort your script when such an error condition occurs, using -ErrorAction Stop to convert the (first) non-terminating error that New-Item reports to a script-terminating one:
$targetDir = New-Item -Force -ErrorAction Stop -Path C:\reports -ItemType Directory
If an error occurs, it will be printed, and the script will be aborted.
If you want to capture errors and perform custom actions, you have two mutually exclusive options:
- Capture the non-terminating error in variable
$Problem, via-ErrorVariable Problem, and act on the value of$Problemafterwards;-ErrorAction SilentlyContinuesuppresses display of the error:[1]
$targetDir = New-Item -Force -ErrorAction SilentlyContinue -ErrorVariable Problem -Path C:\reports -ItemType Directory
if ($Problem) {
Write-Warning "Problem trying to create C:\Reports: $Problem"
# Exit here, if needed.
exit 1
}
- Promote the (first) non-terminating error to a script-terminating one via
-ErrorAction Stopand use atry { ... } catch { ... }statement to catch it, in whosecatchblock$_refers to the error at hand:
try {
$targetDir = New-Item -Force -ErrorAction Stop -Path C:\reports -ItemType Directory
} catch {
$Problem = $_
Write-Warning "Problem trying to create C:\Reports: $Problem"
# Exit here, if needed.
exit 1
}
For a comprehensive overview of PowerShell's surprisingly complex error handling, see this GitHub docs issue.
[1] This makes the capturing of the error via -ErrorVariable silent; do not use -ErrorAction Ignore, as that will render -ErrorVariable ineffective.
