Reputation: 41
I have a script that takes 2 parameters (name and location). I put the name and location into a txt file as per this post here Powershell parameters from file. I got prompted to put in value for the 2nd parameter:
Import-Csv 'C:\temp\paramtest.txt' | % { C:\temp\script\paramtest.ps1 @_ }
cmdlet paramtest.ps1 at command pipeline position 1 Supply values for the following parameters: param2:**
This is what my .txt look like:
"param","param2"
"foo","c:\temp"
"bar","c:\temp"
"foobar","c:\temp"
and the Powershell script is just plain:
Param (
[Parameter(mandatory=$true,Position=1)]
[string]$param,
[Parameter(mandatory=$true,Position=2)]
[string]$param2
)
$greeting='Hello to ' + $param + ' and ' + $param2
Write-Output $greeting
Any help is appreciated.
Upvotes: 3
Views: 11992
Reputation: 174445
When you import the file with Import-Csv
cmdlet, you get objects of type PSCustomObject
back.
The splatting operator (@
) expects a hashtable, not a PSCustomObject
.
To import the parameters from the txt file, you could use ConvertFrom-StringData
cmdlet to return them as hashtables instead:
Get-Content -Path .\test.txt -ReadCount 2 | ForEach-Object {
$Splat = ConvertFrom-StringData $($_ -join [Environment]::NewLine)
.\paramtest.ps1 @Splat
}
And format your text file like this:
param=foo
param2=c:\\temp
param=bar
param2=c:\\temp
param=foobar
param2=c:\\temp
If you are working with PowerShell 2.0, or if you need to retain the csv format, you can do the work yourself by refencing the values from PSCustomObject
into a new hashtable and splat that:
Import-Csv .\test.txt |ForEach-Object {
$Splat = @{}
$_.psobject.Properties |ForEach-Object { $Splat[$_.Name] = $_.Value }
.\paramtest.ps1 @Splat
}
Upvotes: 4