2012-03-27 70 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