Recently I was working on a Power Shell script with many custom functions. When I started to use Power Shell custom objects I wanted to be able to pass them to a function. So I faced the challenge of validating my object for all required properties and came up with this solution, using the ValidateScript block to test the object:

Customizing the ValidateScript

As you can see I use a ValidateScript for the parameter validation to test the object for the required properties. The properties can be specified in an array:
[email protected]("Property1","Property2","Property3", "Property4")
When we call the Function with an appropriate object:

$config= [PSCUSTOMOBJECT]@{ 
    property1= "Value"; 
    property2= "Value"; 
    property3= "Value"; 
    property4= "Value"; 
}

We receive the following output:

PS H:\> New-Example -InputObject $config 
Succesfully passed ValidateScript

Result

If we remove one or more properties from our custom object, an error is thrown:

PS H:\> $config= [PSCUSTOMOBJECT]@{ 
    property1= "Value"; 
    property2= "Value"; 
    property3= "Value"; 
} 

New-Example -InputObject $config 

New-Example : Cannot validate argument on parameter 'InputObject'. Property: 'Property4' missing At line:10 char:26 + New-Example -InputObject $config + ~~~~~~~ + CategoryInfo : InvalidData: (:) [New-Example], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,New-Example

If you want to go a step further you could extend the ValidateScript to...

Prevent passing properties with a NULL or empty value

$_.PSObject.Properties | ForEach-Object { if (([string]::IsNullOrEmpty($_.Value))){ Throw [System.Management.Automation.ValidationMetadataException] "Property '$($_.Name)' has either a NULL or empty value" } }

If we call our function again with the added IsNullOrEmpty validation NULL or emtpy values throw an exception:

PS H:\> $config= [PSCUSTOMOBJECT]@{ 
    property1= "Value"; 
    property2= "Value"; 
    property3= "Value"; 
    property4= $null; 
}

New-Example -InputObject $config 

New-Example : Cannot validate argument on parameter 'InputObject'. Property 'property4' has either a NULL or empty value At line:11 char:26 + New-Example -InputObject $config + ~~~~~~~ + CategoryInfo : InvalidData: (:) [New-Example], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,New-Example

Final Result

Last but not least, here's the full function with an example object:

If you have any questions or improvements just let me know.

Happy ValidateScripting!

Reference