2015-05-28 72 views
4

在PowerShell v5中使用新的類函數,並且如果我們可以將方法放入類中,我正試圖讓自己的頭腦清晰。PowerShell v5類方法 - 問題

我已經嘗試了下面並玩了一下,但一直沒有運氣。

class Server { 

    [string]$computerName = "192.168.0.200" 
    [bool]$ping = (Test-Connection -ComputerName $computerName).count 

} 

$1 = [server]::new() 
$1.computerName = "blah" 

我已經通過設置屬性手動輸入計算機名試過,但我認爲你需要它在創建對象

$1 = [server]::new($computerName = "192.168.0.200") 

例外我越來越有

從$錯誤
[ERROR] Exception calling ".ctor" with "0" argument(s): "Cannot validate argument on parameter 'ComputerName'. The argument is null or empty. Provide an argument that is not null or empty, and then try the 
[ERROR] command again." 
[ERROR] At D:\Google Drive\Projects\VSPowerShell\DiscoveryFramework\DiscoveryFramework\DiscoveryFramework\class.ps1:12 char:1 
[ERROR] + $1 = [server]::new() 
[ERROR] + ~~~~~~~~~~~~~~~~~~~~ 
[ERROR]  + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
[ERROR]  + FullyQualifiedErrorId : ParameterBindingValidationException 
[ERROR] 
[DBG]: PS C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE> 
[DBG]: PS C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE> $1 
Server 
[DBG]: PS C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE> $1.gettype() 
Server 

完全例外鏈接是http://pastebin.com/WtxfYzb5


得到了一點進一步使用$ this.prop,但你不能用你自己的參數啓動構造函數。

PS path:\> class Server { 

    [string]$computerName = "192.168.0.200" 
    [bool]$ping = (Test-Connection -ComputerName $this.computerName).count 

} 

PS path:\> 
PS path:\> $var = [server]::new() 

PS path:\> $var 

computerName ping 
------------ ---- 
192.168.0.200 True 

回答

4

什麼你需要是一個構造(或多個構造函數),如果你不指定類中的一個,你得到的唯一的構造是默認的一個沒有參數。

正如總結你想用不同於默認的IP地址來初始化你的服務器(並允許默認$平火。)

我已經包括了區域我通常包括我類來區分屬性,構造函數和方法。

class Server { 
    #region class properties 
    [string]$computerName = "192.168.0.200" 
    [bool]$ping = (Test-Connection -ComputerName $this.computerName).count 
    #endregion 

    #region class constructors 
    Server() {} 

    Server([string]$computerName) { 
     $this.computerName = $computerName 
    } 
    #endregion 

    #region class methods 
    #endregion 
} 

現在你可以不用傳遞參數給它創建一個對象:創建對象(注:當

[1] PS G:\> $1 = [Server]::new() 
[2] PS G:\> $1 

computerName ping 
------------ ---- 
192.168.0.200 True 



[3] PS G:\> $1.computerName = 'blah' 
[4] PS G:\> $1 

computerName ping 
------------ ---- 
blah   True 

,您現在還可以提供一個IP地址(或服務器名稱),不要」 t提供屬性名稱。)

[5] PS G:\> $2 = [Server]::new("192.168.0.100") 
[6] PS G:\> $2 

computerName ping 
------------ ---- 
192.168.0.100 True 

值得注意的是,請注意,類中有兩個構造函數。當測試這個時,沒有參數的默認構造函數在我指定了我自己的參數之後不再有效,所以當您想要使用所有默認值時,我已經包含一個零參數構造函數。

欲瞭解更多關於這些類,它們的構造函數和方法的信息,我建議檢查視頻Trevor Sullivan在過去幾天發佈。

2

我也一直在V5新的類特性在玩耍,從我在我自己的代碼已經找到,我相信你可能需要「實例化」 Server類並通過這樣做,你可以提供缺省值或計算出的值,這樣的事情:

class Server { 

    [string]$computerName 
    [bool]$ping 

    Server([String]$Computer) { 
     $computerName = $Computer 
     $ping = (Test-Connection -ComputerName $Computer).count 
    } 

} 

$1 = [server]::new("MYCOMPUTER") 
$1 
+0

管理得到更進一步,使用$ this.PROP ---聽以下播客和傑弗裏·斯諾弗設法回答 [http:// powershell。org/wp/2014/12/17/episode-290-powerscripting-podcast-jeffrey-snover-and-john-slack-on-powershell-5-0-technical-preview /] [1] –

+0

必須改變你的代碼有點,它是在我大喊大叫不使用$ this.prop ---類編譯,但我不能用參數重載構造函數。 –