5

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

$error からの完全な例外リンクは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

2 に答える 2

4

必要なのはコンストラクター (または複数のコンストラクター) です。クラス内でコンストラクターを指定しない場合、取得する唯一のコンストラクターは引数のないデフォルトのコンストラクターです。

要約すると、デフォルトとは異なる IP アドレスでサーバーを初期化する必要があります (そして $ping のデフォルトを起動できるようにします)。

プロパティ、コンストラクター、およびメソッドを区別するために、通常クラスに含める領域を含めました。

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 アドレス (またはサーバー名) を指定できるようになりました (プロパティ名は指定しないでください)。

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

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

クラス内に 2 つのコンストラクターがあることに注意してください。これをテストするとき、引数を取らない既定のコンストラクターは、独自のコンストラクターを指定すると無効になったため、すべての既定値を使用する場合に備えて、引数のないコンストラクターを含めました。

これらのクラス、そのコンストラクター、およびメソッドの詳細については、Trevor Sullivanがこの数日間にリリースしたビデオをチェックすることをお勧めします。

于 2015-05-29T01:20:00.280 に答える