使用PowerShell我想捕获用户输入,将输入与Excel电子表格中的数据进行比较,并将相应单元格中的数据写入变量。我对PowerShell相当陌生,似乎无法弄清楚这一点。例如:将提示用户输入“123”。然后将输入与列A中的数据进行比较。捕获相应单元格中的数据并将其写入变量,例如$ GoLiveDate。使用Powershell读取Excel数据并写入变量
任何帮助将不胜感激。
示例数据:http://reddirttechnology.com/table.html
使用PowerShell我想捕获用户输入,将输入与Excel电子表格中的数据进行比较,并将相应单元格中的数据写入变量。我对PowerShell相当陌生,似乎无法弄清楚这一点。例如:将提示用户输入“123”。然后将输入与列A中的数据进行比较。捕获相应单元格中的数据并将其写入变量,例如$ GoLiveDate。使用Powershell读取Excel数据并写入变量
任何帮助将不胜感激。
示例数据:http://reddirttechnology.com/table.html
用户输入可以读取这样的:
$num = Read-Host "Store number"
Excel可以像这样进行处理:
$xl = New-Object -COM "Excel.Application"
$xl.Visible = $true
$wb = $xl.Workbooks.Open("C:\path\to\your.xlsx")
$ws = $wb.Sheets.Item(1)
寻找一个值在一列和分配从另一列到变量的相应值可以这样完成:
for ($i = 1; $i -le 3; $i++) {
if ($ws.Cells.Item($i, 1).Value -eq $num) {
$GoLiveDate = $ws.Cells.Item($i, 2).Value
break
}
}
大功告成后,不要忘了clean up:
$wb.Close()
$xl.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
我觉得最好使用OLEDB连接与Excel交互。它比COM interop更快并且比import-csv更少出错。您可以准备一组psobjects(一个psobject是一行,每个属性对应一列)以匹配您所需的目标网格并将其插入到Excel文件中。同样,您可以插入一个DataTable而不是PSObject集合,但除非从一些数据源检索数据开始,否则PSObject收集方式通常更容易。
这里是一个功能我用写psobject收集到Excel:
function insert-OLEDBData ($file,$sheet,$ocol) {
{
"xlsb$"
{"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0;HDR=YES;IMEX=1`";"}
"xlsx$"
{"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0 Xml;HDR=YES;IMEX=1`";"}
}
$OLEDBCon = New-Object System.Data.OleDb.OleDbConnection($cs)
$hdr = $oCol|gm -MemberType NoteProperty|%{$_.name}
$names = '[' + ($hdr-join"],[") + ']'
$vals = (@("?")*([array]$hdr).length)-join','
$sql = "insert into [$sheet`$] ($names) values ($vals)"
$sqlCmd = New-Object system.Data.OleDb.OleDbCommand($sql)
$sqlCmd.connection = $oledbcon
$cpary = @($null)*([array]$hdr).length
$i=0
[array]$hdr|%{([array]$cpary)[$i] = $sqlCmd.parameters.add($_,"VarChar",255);$i++}
$oledbcon.open()
for ($i=0;$i-lt([array]$ocol).length;$i++)
{
for ($k=0;$k-lt([array]$hdr).length;$k++)
{
([array]$cpary)[$k].value = ([array]$oCol)[$i].(([array]$hdr)[$k])
}
$res = $sqlCmd.ExecuteNonQuery()
}
$OLEDBCon.close()
}
我发现这一点,叶夫根尼·的答案。为了使其工作,我必须对上述功能做一些小的改动。最值得注意的是输入数组中空值或空值的处理。这里是叶夫根尼·代码有一些小的变化:
function insert-OLEDBData {
PARAM (
[Parameter(Mandatory=$True,Position=1)]
[string]$file,
[Parameter(Mandatory=$True,Position=2)]
[string]$sheet,
[Parameter(Mandatory=$True,Position=3)]
[array]$ocol
)
$cs = Switch -regex ($file)
{
"xlsb$"
{"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0;HDR=YES`";"}
"xlsx$"
{"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0 Xml;HDR=YES`";"}
}
$OLEDBCon = New-Object System.Data.OleDb.OleDbConnection($cs)
$hdr = $oCol | Get-Member -MemberType NoteProperty,Property | ForEach-Object {$_.name}
$names = '[' + ($hdr -join "],[") + ']'
$vals = (@("?")*([array]$hdr).length) -join ','
$sql = "insert into [$sheet`$] ($names) values ($vals)"
$sqlCmd = New-Object system.Data.OleDb.OleDbCommand($sql)
$sqlCmd.connection = $oledbcon
$cpary = @($null)*([array]$hdr).length
$i=0
[array]$hdr|%{([array]$cpary)[$i] = $sqlCmd.parameters.add($_,"VarChar",255);$i++}
$oledbcon.open()
for ($i=0;$i -lt ([array]$ocol).length;$i++)
{
for ($k=0;$k -lt ([array]$hdr).length;$k++)
{
IF (([array]$oCol)[$i].(([array]$hdr)[$k]) -notlike "") {
([array]$cpary)[$k].value = ([array]$oCol)[$i].(([array]$hdr)[$k])
} ELSE {
([array]$cpary)[$k].value = ""
}
}
$res = $sqlCmd.ExecuteNonQuery()
}
$OLEDBCon.close()
}
无法设置Value属性的类型PSMemberInfo对象“System.Management.Automation.PSParameterizedProperty”。 At line:7 char:30 + if($ ws.Cells.Item($ i,1)。<<<< Value = $ num){ + CategoryInfo:InvalidOperation:(:) [],RuntimeException + FullyQualifiedErrorId:PropertyAssignmentException 这就是我所得到的。 – squishy79
我的错误。 PowerShell中的比较运算符是'-eq',而不是'='。固定。 –
This Works!我发现阅读excel文件是非常缓慢的。在做一些研究之后,使用Import-CSV cmdlet读取CSV显然会更快。我知道如何用引用的cmdlet调用CSV文件。我将如何接受用户输入并从CSV文件中提取相应的数据? – squishy79