PowerShell函数返回意外的数据
问题描述:
我有一个简单的函数来查找Oracle中的一些数据,并返回一个由表中各种数据元素组成的对象。PowerShell函数返回意外的数据
function Get-OracleInfo {
[OutputType([PSObject])]
Param( [Parameter(Mandatory=$False)][string]$BindValue,
[Parameter(Mandatory=$True)][string]$OraclePath,
[Parameter(Mandatory=$True)][string]$OracledbConnectionString,)
Begin {
$Query="select stuff......"
Add-Type -Path $OraclePath
}
PROCESS {
#get data
try {
$connection=New-Object Oracle.ManagedDataAccess.Client.OracleConnection($OracledbConnectionString)
$connection.Open()
$OprIDLookupCmd=$connection.CreateCommand()
$OprIDLookupCmd.CommandText=$Query
#set bind value to parameter
$OprIDLookupBindParam = New-Object Oracle.ManagedDataAccess.Client.OracleParameter
$AccountLookupBindParam.Value = $BindValue
$AccountLookupCmd.Parameters.Add($AccountLookupBindParam)
$AccountRdr=$AccountLookupCmd.ExecuteReader()
if ($AccountRdr.Read()) {
$accountInfo = New-Object psobject -Property @{'StringVal1'=$AccountRdr.Item("field1")
'StringVal2'=$AccountRdr.Item("field2")
'Date1'=[datetime]$AccountRdr.Item("field3")}
}
}
catch
{
Write-Error ("Error in lookup Account - Can't open connection: {0}`n{1}" -f
$connection.ConnectionString, $_.Exception.ToString())
}
}
END {
if ($connection.State -eq 'Open') { $connection.close() }
return $accountInfo
}
它在Oracle中获取数据就好了,并将表格字段赋值给对象就好了。当在调试中运行它时,查看变量$ accountInfo的值,它将返回一个包含3个属性的对象,就像预期的一样。
String1 Date2 String2
-------- ------------ -----
StringVal2 5/11/2016 12:00:00 AM StringVal2
但主叫从命令行功能并将其分配给一个变量.....当从函数返回时,它显示为具有2个元素的阵列。 $ UserData [1]是返回的对象(表示它显示具有Stringval1,Stringval2,Date1的3个属性的对象)。我弄不明白的是为什么它以数组的形式返回,并且第一个元素(即$ UserData [0])是一个OracleObject。运行命令
$UserData | Get-Member
TypeName: Oracle.ManagedDataAccess.Client.OracleParameter
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone(), System.Object ICloneable.Clone()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
ResetDbType Method void ResetDbType()
ResetOracleDbType Method void ResetOracleDbType()
ToString Method string ToString()
ArrayBindSize Property int[] ArrayBindSize {get;set;}
ArrayBindStatus Property Oracle.ManagedDataAccess.Client.OracleParameterStatus[] ArrayBindStatus {get;set;}
CollectionType Property Oracle.ManagedDataAccess.Client.OracleCollectionType CollectionType {get;set;}
DbType Property System.Data.DbType DbType {get;set;}
Direction Property System.Data.ParameterDirection Direction {get;set;}
IsNullable Property bool IsNullable {get;set;}
Offset Property int Offset {get;set;}
OracleDbType Property Oracle.ManagedDataAccess.Client.OracleDbType OracleDbType {get;set;}
OracleDbTypeEx Property Oracle.ManagedDataAccess.Client.OracleDbType OracleDbTypeEx {get;set;}
ParameterName Property string ParameterName {get;set;}
Precision Property byte Precision {get;set;}
Scale Property byte Scale {get;set;}
Size Property int Size {get;set;}
SourceColumn Property string SourceColumn {get;set;}
SourceColumnNullMapping Property bool SourceColumnNullMapping {get;set;}
SourceVersion Property System.Data.DataRowVersion SourceVersion {get;set;}
Status Property Oracle.ManagedDataAccess.Client.OracleParameterStatus Status {get;set;}
UdtTypeName Property string UdtTypeName {get;set;}
Value Property System.Object Value {get;set;}
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Date1 NoteProperty datetime Date1=5/11/2016 12:00:00 AM
StringVal2 NoteProperty string StringVal2=String2
StringVal1 NoteProperty string StringVal1=String1
希望我的事件和问题的解释意义时,下面是详细信息.....我完全狼狈,所以欣赏任何帮助。 谢谢!
答
尝试抛出上述加法运算的结果:
[void]$AccountLookupCmd.Parameters.Add($AccountLookupBindParam)
感谢迈克,是没有的伎俩!我很想理解为什么这会起作用..... – Jeff
这是因为输出没有被“捕获”,所以它被添加到函数的输出流中。 –
该行为在[documentation](https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_return)中进行了解释。 –