[英]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
如果我理解這個問題,你會問幾件事:
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中,它可以使用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.