使用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