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のNet.DnsでGetHostName()メソッドで取得
[Net.Dns]::GetHostName()
hostnameコマンドで取得
hostname
HostName取得実行結果
Measure-Commandの結果です。
| 処理種別 | 処理 | 所要時間 |
|---|---|---|
| CIM | (Get-CimInstance -Class Win32_ComputerSystem).Name |
389.68ms |
| 環境変数 | $Env:COMPUTERNAME |
147.0818ms |
| .NET | [Net.Dns]::GetHostName() |
121.98ms |
| hostname | hostname |
165.8101ms |
.NETが最速ですね。

IP Address を取得する
ぱっと思いつくやり方で3つあります。
Get-NetIPAddressから取得する- .NETの
Net.DnsでGetHostAddresses('').IPAddressToStringを利用する ipconfigコマンドから取得する
小細工を3つ足して、それぞれこのように取得できます。
Get-NetIPAddressで取得
# 1. Ethernetとアダプタ名のつくものを選択しています。 (Get-NetIPAddress | where{$_.InterfaceAlias -eq "Ethernet"}).IPAddress # 2. IP Addressだけを取得したり渡すときに、 PowerShell 3.0 の省略記法で書くと (Get-NetIPAddress | where InterfaceAlias -eq "Ethernet" | select -ExpandProperty IPAddress) # 3. IP Addressだけを取得したり渡すときに、 PowerShell 2.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の結果です。
| 処理種別 | 処理 | 所要時間 |
|---|---|---|
| CIM | (Get-CimInstance -Class Win32_ComputerSystem).Name |
389.68ms |
| PowerShell | Get-NetIPAddress |
1183.11ms |
| PowerShell | Get-NetIPAddress V3記法 |
1200.11ms |
| PowerShell | Get-NetIPAddress V2記法 |
1233.11ms |
| .NET | [Net.Dns]::GetHostAddresses() |
189.55ms |
| .NET | [Net.Dns]::GetHostAddresses() [1] |
289.31ms |
| ipconfig | ipconfig |
386.26ms |
| PowerShell | ipconfig |
386.26ms |
またしても.NETが最速ですね。
まとめ
速度重視なら .NET利用が最速ですね。 外部コマンドより早いのは流石でした。 PipeLineでつなげたり、しれっと取得するならPowerShellコマンドレットなのですが、速度的にはアレなのは何時もの通りです。