私は、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=Get-OracleInfo -BindValue $account -OraclePath $OraclePath -OracledbConnectionString $OracledbConnectionString
$ UserDataを[1](それはStringval1、Stringval2、日付1の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
のコマンドを実行している場合は、以下の詳細がうまくいけば、イベントや問題の私の説明は、私は完全にflummoxedだ.....意味をなさないので、どのような援助に感謝しています。 ありがとう!
おかげでマイクを!私はこれがなぜ機能するのか理解したいと思っています..... – Jeff
その出力は「捕捉」されていないので、関数の出力ストリームに追加されています。 –
動作は[documentation](https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_return)で説明されています。 –