Ich habe eine einfache Funktion, um einige Daten in Oracle nachzuschlagen und ein Objekt, das aus den verschiedenen Datenelementen besteht, aus der Tabelle zurückzugeben.PowerShell Funktion, die unerwartete Daten zurückgibt
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
}
es bekommt die Daten nur gut in Oracle, und ordnet die Tabellenfelder für das Objekt nur in Ordnung. Wenn Sie dies im Debug ausführen, sehen Sie sich die Werte für die Variable $ accountInfo an und geben genau wie erwartet ein Objekt mit 3 Eigenschaften zurück.
String1 Date2 String2
-------- ------------ -----
StringVal2 5/11/2016 12:00:00 AM StringVal2
aber wenn die Funktion von der Kommandozeile aufrufen und auf eine variable Zuordnung ..... auf von der Funktion zurückkehrt, zeigt es als ein Array mit 2 Elementen.
$UserData=Get-OracleInfo -BindValue $account -OraclePath $OraclePath -OracledbConnectionString $OracledbConnectionString
$ Userdata [1] ist das zurückgegebene Objekt (was bedeutet es, das Objekt mit den drei Eigenschaften von Stringval1 zeigt, Stringval2, Date1). Das Ding, das ich nicht herausfinden kann, ist, warum es als ein Array zurückkehrt, und das erste Element (d. H. $ UserData [0]) ist ein OracleObject. Im Folgenden sind die Details, wenn Sie den Befehl ausführen
$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
Hoffentlich meine Erklärung der Ereignisse und das Problem Sinn machen ..... bin ich völlig verblüfft, so jede Hilfe zu schätzen wissen. Danke!
Dank Mike, dass der Trick! Ich würde gerne verstehen, warum das funktioniert. – Jeff
Es ist, weil diese Ausgabe nicht "erfasst" wurde, so dass es zum Ausgabestrom der Funktion hinzugefügt wurde. –
Das Verhalten wird in der [Dokumentation] (https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_return) erläutert. –