powershell script reading parameters from txt

10,168

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
}
Share:
10,168
lmbNbirt
Author by

lmbNbirt

Updated on June 05, 2022

Comments

  • lmbNbirt
    lmbNbirt almost 2 years

    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.