I recently received a question on Reddit that asked if it is possible to use a csv file to create a hash table that can be used for splatting parameters into a function. The goal of this exercise is to be able to specify a csv file and to pass on the proper arguments to a function.
For example there is a csv file with the following contents:

So based on this the New-Server function should be called as such:
1
| New-Server -Templare 2012R2 -Spec DomainJoinSpec -Datastore Production2 -Cpus 1 |
New-Server -Templare 2012R2 -Spec DomainJoinSpec -Datastore Production2 -Cpus 1
In order to achieve this, the first step would be to remove the empty fields from the equasion as such:
1
2
| $Csv = Import-Csv -Path Parameters.csv
$Csv.psobject.Properties | Where-Object {$_.Value} |
$Csv = Import-Csv -Path Parameters.csv
$Csv.psobject.Properties | Where-Object {$_.Value}
This will import the csv and only display the colums in the csv that actually contain data. To ensure this data is stored in a hash table we can use the ForEach-Object. This cmdlet can be used to loop through the remaining results and to create a hashtable:
1
2
3
4
5
6
| $Csv = Import-Csv c:\temp\params.csv
$Csv.psobject.Properties | Where-Object {$_.Value} | ForEach-Object -Begin {
$SplatParams = @{}
} -Process {
$SplatParams[$_.Name] = $_.Value
} |
$Csv = Import-Csv c:\temp\params.csv
$Csv.psobject.Properties | Where-Object {$_.Value} | ForEach-Object -Begin {
$SplatParams = @{}
} -Process {
$SplatParams[$_.Name] = $_.Value
}
Now that the hash table has been created this can be used for splatting into the New-Server function:
1
| New-Server @SplatParams |
New-Server @SplatParams
By combining the ForEach-Object cmdlet and the PSObject property that is piped into Where-Object it is possible to construct a custom hashtable that can be used for splatting. This can provide an easy alternative for non-technical users to provide parameters and arguments into a PowerShell function.
Like this:
Like Loading...