簡體   English   中英

Powershell定義Powershell對象

[英]Powershell Define Powershell Objects

我喜歡以結構化的方式定義我的變量。 但是,大多數MSDN博客都沒有這樣做。

例如:[object] myObj = ...

這是Powershell中所有對象的正確默認格式嗎?

像這樣使用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

如果我理解這個問題,你會問幾件事:

  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'

雖然類型系統在指定Object時會愉快地推斷Int32 ,但當推斷類型不兼容時,顯式類型會獲勝。 例如:

$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的答案非常好。

由於Powershell 3還可以將HashTable解析為自定義對象,例如:

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

或者,如果您想在對象中定義更詳細的類型,可以使用New-Module中的-AsCustomObject參數

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

因為沒有像posh中的類那樣你可以向你的對象添加自定義類名和命名空間,你可以稍后查詢(偽實例;)

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

如果我理解你的問題,你會問

  • 如何在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”調用對象時

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

如果您使用的是PowerShell 3.0,則可以通過更少的輸入獲得相同的結果,如下所示

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

創建PSObject對象是從腳本語言訪問所有對象的基礎,並為cmdlet開發人員提供了抽象,

它在powershell的不同版本中有所不同。

新對象PSObject -Property [HashTable]


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

您還可以創建這樣的快速對象:

$ myVar =“”| 選擇column1,column2,column3

這將創建具有3個NoteProperties的對象,並且您可以正常訪問每個屬性,例如

$ myVar.column1

PS考慮到這是Selecte.System.String而不是System.Management.Automation.PSCustomObject。

足以保持數據行,導出,訪問數據單元。

更新:更靈活的解決方案,仍然易於實現Hashtable創建如下。

$ myVar2 = @ {

列1 =值1

列2 =值2

欄3 =值3

}

這將創建System.Collections.Hashtable類型的變量

用一些不錯的方法

關於hermitagup

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM