lmbNbirt
lmbNbirt

Reputation: 41

powershell script reading parameters from txt

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

Answers (1)

Mathias R. Jessen
Mathias R. Jessen

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.


PowerShell 3.0+

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:

text.txt

param=foo
param2=c:\\temp
param=bar
param2=c:\\temp
param=foobar
param2=c:\\temp

PowerShell 2.0

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

Related Questions