PowerShellでは、HostName や IP Address を取得するのにいくつかやり方が考えられます。 今回、PSRemoting中に取得するに当たって、どの方法が最も実行速度が速いのかを測ってみたので公開します。
検証環境
以下を 同一Zoneの Public VPCからPrivate VPC x2 に向けて10回実行した結果で、単一インスタンスに対して最も遅かった時間(ms)を取得しています。 (初回のDNS解決はICMPで処理済み)
- PS Remoting 接続元サーバー (Public VPC)
Amazon AWS EC2 インスタンス (m1.large) with Windows Server 2012
- PS Remoting 接続先サーバー x 2 (Private VPC)
Amazon AWS EC2 インスタンス (m1.medium) with Windows Server 2012
HostName を取得する
ぱっと思いつくやり方で4つあります。
- CIM (WMI) から取得する
- 環境変数 $Env:COMPUTERNAME から取得する
- Net.DnsでGetHostName()メソッドを利用する
- hostnameコマンドから取得する
実行コマンド例
それぞれこのように取得できます。
- CIM (WMI) から取得する
(Get-CimInstance -Class Win32_ComputerSystem).Name
- 環境変数 $Env:COMPUTERNAME から取得する
$Env:COMPUTERNAME
- Net.DnsでGetHostName()メソッドを利用する
[Net.Dns]::GetHostName()
- hostnameコマンドから取得する
hostname
HostName 取得実行結果
それぞれmeasure-commandでの取得結果です。
CIM | Environment Variables | .NET | hostname |
(Get-CimInstance -Class Win32_ComputerSystem).Name | $Env:COMPUTERNAME | [Net.Dns]::GetHostName() | hostname |
389.68ms | 147.0818ms | 121.98ms | 165.8101ms |
.NETが最速ですね。
IP Address を取得する
ぱっと思いつくやり方で3つあります。
- Get-NetIPAddress から取得する
- Net.DnsでGetHostAddresses('').IPAddressToStringを利用する
- ipconfig コマンドから取得する
実行コマンド例
小細工を3つ足して、それぞれこのように取得できます。
- Get-NetIPAddress から取得する
# 1. Ethernetとアダプタ名のつくものを選択しています。 (Get-NetIPAddress | where{$_.InterfaceAlias -eq "Ethernet"}).IPAddress # 2. IP Addressだけを取得したり渡すときに、 PowerShell V3.0 の省略記法で書くと (Get-NetIPAddress | where InterfaceAlias -eq "Ethernet" | select -ExpandProperty IPAddress) # 3. IP Addressだけを取得したり渡すときに、 PowerShell V2.0 の記法で書くと Get-NetIPAddress | where{$_.InterfaceAlias -eq "Ethernet"} | select -ExpandProperty IPAddress
- Net.DnsでGetHostAddresses('').IPAddressToStringを利用する
#4. 纏めて取得 [Net.Dns]::GetHostAddresses('').IPAddressToString #5. ただしこれでは、IPが複数取れてしまうので、自分のIPだけを取得します。 [Net.Dns]::GetHostAddresses('').IPAddressToString[1]
- ipconfig コマンドから取得する
#6. 文字列操作 (白目 ipconfig | where{$_ -match "IPv4 Address. . . . . . . . . . . : (?.*)"} | %{$Matches.ip}
IP Address 取得実行結果
それぞれmeasure-commandでの取得結果です。 PowerShellコマンドレットから
Summary | PowerShell | ||
Command | Get-NetIPAddress | Get-NetIPAddress V3記法 | Get-NetIPAddress V2記法 |
Duration | 1183.11 ms | 1200.11 ms | 1233.11 ms |
続いて、.NET
Summary | .NET | |
Command | [Net.Dns]::GetHostAddresses() | [Net.Dns]::GetHostAddresses() [1] |
Duration | 189.55 ms | 289.31 ms |
最後にipconfig
Summary | ipconfig |
Command | ipconfig |
Duration | 386.26 ms |
またしても.NETが最速ですね。
まとめ
速度重視なら .NET 利用が最速ですね。 外部コマンドより早いのは流石でした。 PipeLine でつなげたり、しれっと取得するなら PowerShell Cmdletなのですが、速度的にはアレなのは何時もの通りです。