powershell script reading parameters from txt

霸气de小男生 提交于 2019-12-07 16:38:20

问题


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.


回答1:


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
}


来源:https://stackoverflow.com/questions/31464550/powershell-script-reading-parameters-from-txt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!