2016-05-08 1 views
1

Я пытаюсь добавить настраиваемое свойство к встроенному типу PowerShell, а затем преобразовать объект в Json. Проблема, с которой я сталкиваюсь, заключается в том, что ConvertTo-Json не будет преобразовывать настраиваемое свойство, которое я добавляю. Например,ConvertTo-Json не может преобразовать пользовательские свойства, добавленные во встроенные типы

$Proc = Get-Process explorer 
$Proc.Modules | %{ 
    $_ | Add-Member NoteProperty MyCustomProperty "123456" -PassThru 
} 

$Proc.Modules[0].MyCustomProperty -eq "123456"  
# Returns true 

$Json = ConvertTo-Json ($Proc.Modules) -Depth 4 
$Json -match "123456" 
# Returns false. Expect it to be true 

Edit: Если я использую "SELECT *" с ConvertTo-Json, то он работает. Например.

$Json = ConvertTo-Json ($Proc.Modules | select *) -Depth 4 
$Json -match "123456" 
# Returns true 

Может ли кто-нибудь объяснить, почему это происходит?

+1

PowerShell v2 не включает командлет ConvertTo-Json. Если вы используете какую-то пользовательскую реализацию, то вы должны указать, какой из них. – PetSerAl

+0

Исправлено. Проблема все еще возникает во всех версиях PS> = 3.0 – arwan

+1

Бывает, что 'ConvertTo-Json' просматривает пользовательские свойства только тогда, когда видит' PSObject'. – PetSerAl

ответ

0

Кажется, что ConvertTo-Json рассматривает расширенные свойства только тогда, когда видит PSObject экземпляр. Если вы передаете развернутый объект, то свойства только базовый объект получит в результате JSON:

Add-Type -TypeDefinition @' 
    using System; 
    using System.Management.Automation; 
    public class SomeType { 
     public static SomeType NewInstanceWithExtendedProperty() { 
      SomeType instance = new SomeType(); 
      PSObject.AsPSObject(instance).Properties.Add(new PSNoteProperty("ExtendedProperty", "ExtendedValue")); 
      return instance; 
     } 
     public string SomeProperty { 
      get { 
       return "SomeValue"; 
      } 
     } 

    } 
'@ 
$a=[SomeType]::NewInstanceWithExtendedProperty() 
ConvertTo-Json ($a, [PSObject]$a) 

Этот код возврата:

[ 
    { 
     "SomeProperty": "SomeValue" 
    }, 
    { 
     "SomeProperty": "SomeValue", 
     "ExtendedProperty": "ExtendedValue" 
    } 
] 

Как вы можете видеть, ExtendedProperty получить в формате JSON только тогда, когда вы явно отливать $a - PSObject.