可以通过ExpandProperty获得属性值,但不能通过直接访问获得

时间:2018-09-28 01:31:01

标签: powershell

我有一个System.Data.DataSet对象,该对象已被序列化,然后反序列化为PSObject。

我正在尝试访问从标题为Properties的表的列中填充的属性。

虽然Get-Member显示对象具有名为Properties的属性,但是我可以使用select -ExpandProperties来获取值,但是我不能作为对象的属性直接访问它。 / p>

更新: 实际的SQL查询在服务器上运行,结果使用Export-CliXml进行序列化,并放置在可访问的共享中。使用Import-CliXml将结果重新水化,这将导致对象类型以Deserialized为前缀,如下面的Mötz所指出的。对此的解释可以在here中找到。

$> $res.Tables[0] | Get-Member

TypeName: Deserialized.System.Data.DataRow

Name       MemberType Definition
----       ---------- ----------
GetType    Method     type GetType()
ToString   Method     string ToString(), string ToString(string format, System.IFormatProvider formatProvider), string IFormattable.ToString(string format, System.IFormatProvider formatProvider)
Properties Property   System.String {get;set;}

$> $res.Tables[0].Properties
$> $res.Tables[0]."Properties"
$> $res.Tables[0] | select -ExpandProperty "Properties"
<object type= .... > .... </object>

1 个答案:

答案 0 :(得分:1)

我们需要更多帮助我们。我们不知道您的数据源是什么样,表结构和其他重要细节。

我只是对一个数据库进行了快速采样,结果看起来有些不同。

$SqlConnection = new-object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "data source=.;Initial catalog=db;Trusted_Connection=True;"

$SqlCommand = $SqlConnection.CreateCommand()
$SqlCommand.CommandText = "SELECT * FROM dbo.Table"
$DataAdapter = new-object System.Data.SqlClient.SqlDataAdapter $SqlCommand

$dataset = new-object System.Data.Dataset
$DataAdapter.Fill($dataset)

您的类型说:“ Deserialized.System.Data.DataRow”,而我的话说“ System.Data.DataRow”。

PS C:\windows\system32> $dataset.Tables[0] | Get-Member


   TypeName: System.Data.DataRow

Name                      MemberType            Definition
----                      ----------            ----------
AcceptChanges             Method                void AcceptChanges()
BeginEdit                 Method                void BeginEdit()
CancelEdit                Method                void CancelEdit()
ClearErrors               Method                void ClearErrors()
Delete                    Method                void Delete()
EndEdit                   Method                void EndEdit()
Equals                    Method                bool Equals(System.Object obj)
GetChildRows              Method                System.Data.DataRow[] GetChildRows(string relationName), System.Data...
GetColumnError            Method                string GetColumnError(int columnIndex), string GetColumnError(string...
GetColumnsInError         Method                System.Data.DataColumn[] GetColumnsInError()
GetHashCode               Method                int GetHashCode()
GetParentRow              Method                System.Data.DataRow GetParentRow(string relationName), System.Data.D...
GetParentRows             Method                System.Data.DataRow[] GetParentRows(string relationName), System.Dat...
GetType                   Method                type GetType()
HasVersion                Method                bool HasVersion(System.Data.DataRowVersion version)
IsNull                    Method                bool IsNull(int columnIndex), bool IsNull(string columnName), bool I...
RejectChanges             Method                void RejectChanges()
SetAdded                  Method                void SetAdded()
SetColumnError            Method                void SetColumnError(int columnIndex, string error), void SetColumnEr...
SetModified               Method                void SetModified()
SetParentRow              Method                void SetParentRow(System.Data.DataRow parentRow), void SetParentRow(...
ToString                  Method                string ToString()
Item                      ParameterizedProperty System.Object Item(int columnIndex) {get;set;}, System.Object Item(s...
ACCOUNTTYPE               Property              int ACCOUNTTYPE {get;set;}
AUTOINFO                  Property              int AUTOINFO {get;set;}
AUTOLOGOFF                Property              int AUTOLOGOFF {get;set;}
AUTOUPDATE                Property              int AUTOUPDATE {get;set;}
CLIENTACCESSLOGLEVEL      Property              int CLIENTACCESSLOGLEVEL {get;set;}
COMPANY                   Property              string COMPANY {get;set;}
COMPILERWARNINGLEVEL      Property              int COMPILERWARNINGLEVEL {get;set;}
CONFIRMDELETE             Property              int CONFIRMDELETE {get;set;}
CONFIRMUPDATE             Property              int CONFIRMUPDATE {get;set;}
CREDENTIALRECID           Property              long CREDENTIALRECID {get;set;}
DEBUGGERPOPUP             Property              int DEBUGGERPOPUP {get;set;}
...                       ...                   ...

因此,我可以使用的方法列表超出了您的列表。那是第一。接下来是我所有的属性都映射到表中的列。

所以我想您需要共享更多有关如何将数据填充到数据集对象中的代码,以便我们了解您所面临的情况。