我有一个PowerShell脚本,可以使用OLEDB从Excel文件中读取。我做了一个功能,根据一些参数建立连接,这很好。它创建System.Data.OleDb.OleDbConnection连接,然后将其传递给其他函数以获取有关工作表(工作表名称,列名称)的其他信息。
这些函数都运行良好,直到我将连接对象传递给实际查询电子表格中主要工作表的函数。在调用该函数之前,我可以使用GetType()
方法验证连接对象是否仍是System.Data.OleDb.OleDbConnection对象。但是在函数内部,它突然变成System.Object[]
,在我的函数完成任何工作之前。
因此,当我尝试将连接分配给新的OleDbCommand对象时,收到错误:
异常设置“连接”:“无法将类型为”System.Object []“的”System.Object []“值转换为”System.D“ ata.OleDb.OleDbConnection “” 在D:\ Scripts \ AdvancementSpreadsheetImport.ps1:130 char:18 + $命令。 <<<<连接= $连接 + CategoryInfo:InvalidOperation:(:) [],RuntimeException + FullyQualifiedErrorId:PropertyAssignmentException
将代码放在功能块之外并将其放在脚本的主体中,一切正常。
知道是什么给出了什么?
创建连接:
Function connectToSheet($sheetPath) {
try {
#Construct the data source
$provider = "Provider=Microsoft.ACE.OLEDB.12.0" #Microsoft.Jet.OLEDB.4.0"
$dataSource = "Data Source=`"$sheetPath`""
$extend = 'Extended Properties="Excel 12.0 Xml;HDR=YES;"'
$connection = New-Object System.Data.OleDb.OleDbConnection("$provider;$dataSource;$extend;")
$connection.Open()
log("Connection to $sheetPath open")
return $connection
}
catch {handleError("Error opening OLE connection to the spreadsheet $sheetPath.")}
}
违规功能:
Function constructIndexFile($connection, $sheetName, $outputPath, $outputFileName) {
log("Connection info: $($connection.GetType())") #You can see that the connection object's type has changed at this point
try {
$query = "select [col1], [col2] from [$sheetName] where [col1] <> `"`""
$command = New-Object System.Data.OleDb.OleDbCommand($query)
下一行会触发错误。
$command.Connection = $connection
$DataReader = $command.ExecuteReader()
$indexFileStream = [System.IO.StreamWriter] "$outputFileName"
While ($DataReader.read()) {
##Do stuff to construct my index file
}
$indexFileStream.close()
log("Created index file $outputFileName")
}
catch {handleError("Error constructing the index file")}
}
答案 0 :(得分:3)
PowerShell不使用括号来调用函数;相反,在用空格分隔的函数名之后传递参数。因此,而不是
function_name(param[, ...])
写
function_name param [...]