Определить объекты PowerShell - PullRequest
3 голосов
/ 27 марта 2012

Мне нравится определять свои переменные в структурированном виде.Однако большинство блогов MSDN этого не делают.

Например: [object] myObj = ...

Это правильный формат по умолчанию для всех объектов в Powershell?

Ответы [ 6 ]

9 голосов
/ 27 марта 2012

Используйте PsObject следующим образом:

$o = new-Object PsObject -property @{Name='donald'; Kind='duck' }

Вы передаете хеш-таблицу в качестве аргумента для параметра -property.Также вы можете создать пустой объект и добавить свойства позже:

$o = New-Object PsObject
$o | Add-Member NoteProperty project myproj.csproj
$o | Add-Member NoteProperty Success $true

Вы, конечно, можете использовать трубу для Add-Member

$o = New-Object PsObject
# ...
$o | 
   Add-Member NoteProperty project myproj.csproj -pass |
   Add-Member NoteProperty Success $true
2 голосов
/ 27 марта 2012

Если я понимаю вопрос, вы задаете пару вещей:

  1. Можете ли вы явно указать тип переменной?
  2. Какой тип использует Powershell, если вы сами его не указали?

Powershell, безусловно, позволит вам явно указывать тип, но также будет выводить типы. Обратите внимание, что, поскольку все типы наследуются от System.Object, явное указание [object] в комбинированном операторе объявления / назначения не имеет значения, которое я вижу. Система типов по-прежнему выведет соответствующий дочерний тип. Например:

$x = 3
$x.GetType() # Returns 'Int32'

Remove-Variable x
[object] $x = 3
$x.GetType() # Returns 'Int32'

Remove-Variable x
[valuetype] $x = 3
$x.GetType() # Returns 'Int32'

Remove-Variable x
[int] $x = 3
$x.GetType() # Returns 'Int32'

Если вы разделите объявление и присваивание, вы можете создать переменную типа Object:

Remove-Variable x
$x = new-object -TypeName Object
$x.GetType() # Returns 'Object'

... но как только вы присвоите значение, переменная все равно получит новый предполагаемый тип:

$x = 3
$x.GetType() # Returns 'Int32'

Хотя система типов будет счастливо выводить Int32 при указании Object, явные типы выигрывают, когда выведенный тип будет несовместим. Например:

$x = 3          # Gets inferred type 'Int32'
[string] $x = 3 # Gets explicit type 'String'

$x = 'x'        # Gets inferred type 'String'
[char] $x = 'x' # Gets explicit type 'Char'

Если ваш вопрос больше ориентирован на определение и использование пользовательских типов объектов, Stej ответит отлично.

1 голос
/ 06 сентября 2013

Начиная с Powershell 3, можно также анализировать HashTables для пользовательских объектов, таких как:

[PSObject] $Piza = [PSCustomObject] @{
    Ingredients = 4
}

Или, если вы хотите определить более подробные типы в вашем объекте, вы можете использовать параметр -AsCustomObject из New-Module

[PSObject] $Piza = New-Module -AsCustomObject -ScriptBlock {
    [Guid]$id = [Guid]::NewGuid()
    [String] $Name = 'Macaroni' 

    Function TestFunction() {}

    # Dont forget to export your members and functions 
    # as this is built up as a module and stuffed into 
    # an object later
    Export-ModuleMember -Function * -Variable *
}

Поскольку в шикарном классе нет вещей, таких как классы, вы можете добавить к вашему объекту пользовательские имена классов и пространства имен, которые вы можете запросить позже (псевдоэкземпляр;)

$Piza.PSObject.TypeNames.Insert(0, 'Pizas.Macaroni')
0 голосов
/ 18 декабря 2014

Вы также можете создавать такие быстрые объекты:

$ myVar = "" |выберите столбец 1, столбец 2, столбец 3

. Это создаст объект с 3 объектами NoteProperties, и у вас будет доступ к каждому свойству в обычном режиме, например

$ myVar.column1

PSучтите, что это Selecte.System.String, а не System.Management.Automation.PSCustomObject.

Все еще достаточно для хранения строк данных, экспорта и доступа к ячейкам данных.

Обновление: более гибкоеРешение, и все же простое в реализации, было бы создано Hashtable, как показано ниже.

$ myVar2 = @ {

column1 = value1

column2 = значение2

column3 = значение3

}

Это создаст переменную типа System.Collections.Hashtable

с некоторыми хорошими методами

Относительно hermitagup

0 голосов
/ 27 сентября 2013

Создание объекта PSObject является основой для доступа ко всем объектам из языка сценариев и обеспечивает абстракцию для разработчика командлета и

Отличается в разных версиях powershell ..

New-Object PSObject –Property [HashTable]


     $Object = New-Object PSObject`                                       
     $Object | add-member Noteproperty LineNumber       $LineNumber                 
     $Object | add-member Noteproperty Date             $TodayDate       
0 голосов
/ 01 апреля 2013

Если я правильно понимаю ваш вопрос, вы спрашиваете

  • Как создать собственный объект в powershell?

В powershell он может создавать экземпляр объекта .Net с помощью New-Object . Как это

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate2("http://stackoverflow.com/")
$ie.Visible = $true

Приведенный выше код создает com-объект, который перемещается, т. Е. К stackoverflow.

И, если вы хотите создать свой собственный объект, PSObject будет вашим выбором. Как ниже

$obj = New-Object PSObject -Property @{
    Name = "Your Name"
    Age = 30
}

Когда вы вызываете объект, используя "$ obj"

$obj
Age Name
--- ----
30 Your Name

Если вы используете powershell 3.0, вы можете получить тот же результат с меньшим набором текста, как показано ниже

[PSCustomObject] @{
    Name = "Your Name"
    Age = 30
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...