2012-03-27 67 views
3

我喜欢以结构化的方式定义我的变量。然而,大多数MSDN博客不这样做。Powershell定义PowerShell对象

例如: [对象] MyObj中= ...

这是对在PowerShell中的所有对象的正确默认格式?

回答

9

使用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

快捷方式:$ O = [PSCustomObject] @ {名称= '唐纳德' ; Kind ='Duck'} 从'New Conversion'部分下的Powershell v3(blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx)开始 – tkokasih 2014-03-24 00:03:03

2

如果我理解这个问题,你问一对夫妇的事情:

  1. 你能明确指定一个变量的类型吗?
  2. 如果您自己没有指定Powershell,那么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,明确的类型取胜当推断类型WOU ld不兼容。例如:

$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的答案是优秀的。

+0

在您的示例中,你并没有真正分解声明和任务。 $ x = new-object -TypeName对象是一个赋值。而$ x.GetType()返回值的类型。 – mcoolive 2014-12-19 13:03:42

0

如果我正确地理解你的问题,你问

  • 如何在PowerShell中创建自定义对象?

在powershell中,它能够使用New-Object创建.Net对象的实例。像这样

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

上面的代码创建一个com对象,它可以导航你的ie到stackoverflow。

而且,如果你想创建自己的对象,PSObject将是你的选择。像下面

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

当您使用“$目标文件”

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

如果您在使用PowerShell 3.0调用对象,你可以用更少的输入得到相同的结果类似下面

[PSCustomObject] @{ 
    Name = "Your Name" 
    Age = 30 
} 
1

由于Powershell 3还可以解析HashTable到 自定义对象,如:

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

或者,如果你想在你的对象来定义更详细的类型 你可以从New-模块

[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 * 
} 

使用-AsCustomObject参数作为没有的东西在豪华类,您可以添加自定义 类名和命名空间到你的对象 以后可以查询(伪实例;)

$Piza.PSObject.TypeNames.Insert(0, 'Pizas.Macaroni') 
0

创作PSObject对象是从脚本语言访问所有对象的基础,提供了cmdlet的开发商和抽象

它不同于在不同版本的PowerShell ..

新物体PSObject -Property [哈希表]


    $Object = New-Object PSObject`          
    $Object | add-member Noteproperty LineNumber  $LineNumber     
    $Object | add-member Noteproperty Date    $TodayDate  
0

您还可以创建这样的快速的对象:

$ myVar =“”|选择列1,列2,栏3

这将创建对象,具有3个NoteProperties ,你必须访问的每个属性正常的基础上,像

$ myVar.column1

附:考虑到这是Selecte.System.String而不是System.Management.Automation.PSCustomObject。

仍然足以保存数据行,导出,访问数据单元。

更新:更灵活的解决方案,仍然容易实现将Hashtable创建如下。

$ myVar2 = @ {

COLUMN1 =值1

列2 =值2

栏3 =值3

}

这将创建型System.Collections.Hashtable

的变量有一些不错的方法

问候 hermitagup