I want PowerShell to throw an error when trying to select non-existing properties, but instead I get empty column as output. Example:
$ErrorActionPreference=[System.Management.Automation.ActionPreference]::Stop;
Set-StrictMode -Version 'Latest'
Get-Process *ex* | Select-Object Id,ProcessName,xxx
Id ProcessName xxx
-- ----------- ---
9084 explorer
11404 procexp
I wrote a script that is importing multiple text files by Import-Csv
, but headers in those file may change, and I'll end up with empty columns being loaded to the system.
EDIT: This is how I'm checking if the headers match:
$csv = Import-Csv -Delimiter ';' -Path $file.FullName
$FileHeaders = @(($csv | Get-Member -MemberType NoteProperty).Name)
if (Compare-Object $ProperHeaders $FileHeaders) {'err'} else {'ok'}
I know that's the way PowerShell works, but Set-StrictMode
documentation was indeed a little misleading for me, as @Matt mentioned. I just wish Select-Object
had some kind of "-NoNewImplicitProps" or "-ReadOnlyPipeline" switch that would do the job for me :). Thanks for the answers.
You are actually using what some people would call a feature. That is a simpler rendition of using
Add-Member
on all the array members to add an empty column.In the case of
Import-CSV
what you do in that case is check the property names before theSelect
where you call them.I can see the documentation be a little misleading when it says for
Set-StrictMode
:But in this case you are not trying to get the property reference but using a function of the
Select-Object
cmdlet. The following would have generated an error thoughSomething like this...?
PowerShell expanding non-existing properties to
$null
behaves as designed. AFAICS the only thing you could do is to explicitly check if all properties exist:Of course you could wrap this in a custom function:
so it could be used like this: