我有一个带有2个参数(名称和位置)的脚本。我根据此帖Powershell parameters from file将名称和位置放入txt文件中。我被提示为第二个参数输入值:
Import-Csv 'C:\temp\paramtest.txt' | % { C:\temp\script\paramtest.ps1 @_ }
cmdlet paramtest.ps1 at命令管道位置1的供应值 以下参数:param2:**
这就是我的.txt的样子:
"param","param2"
"foo","c:\temp"
"bar","c:\temp"
"foobar","c:\temp"
和Powershell脚本很简单:
Param (
[Parameter(mandatory=$true,Position=1)]
[string]$param,
[Parameter(mandatory=$true,Position=2)]
[string]$param2
)
$greeting='Hello to ' + $param + ' and ' + $param2
Write-Output $greeting
感谢任何帮助。
答案 0 :(得分:4)
使用Import-Csv
cmdlet导入文件时,会返回PSCustomObject
类型的对象。
splatting operator (@
)需要哈希表,而不是PSCustomObject
。
要从txt文件导入参数,可以使用ConvertFrom-StringData
cmdlet将它们作为哈希表返回:
Get-Content -Path .\test.txt -ReadCount 2 | ForEach-Object {
$Splat = ConvertFrom-StringData $($_ -join [Environment]::NewLine)
.\paramtest.ps1 @Splat
}
并将文本文件格式化为:
param=foo
param2=c:\\temp
param=bar
param2=c:\\temp
param=foobar
param2=c:\\temp
如果您正在使用PowerShell 2.0,或者您需要保留csv格式,则可以通过将PSCustomObject
中的值重新添加到新的哈希表中来自行完成工作并执行以下操作:
Import-Csv .\test.txt |ForEach-Object {
$Splat = @{}
$_.psobject.Properties |ForEach-Object { $Splat[$_.Name] = $_.Value }
.\paramtest.ps1 @Splat
}