🗺

IPアドレス確認はPowerShell「gip」で!コマンドプロンプト「ipconfig」からの卒業

に公開

PowerShellのコマンドレットってコマンドが長いイメージありますよね。

モダンなWindows Terminalであれば、Tabキーをつかった入力補完機能を使うという手もありますが、候補が多いのでコマンドをある程度覚えておく必要があります。

わたしが最近、意識的に使っているのはエイリアスを使ったコマンドレットの実行。
タイトルにある「gip」とは「Get-NetIPConfiguration」のことで22文字から3文字で文字数の差はなんと「19文字」です。

コマンドの覚え方も“G et I P アドレス”と記憶すると簡単。
参考情報:過去にエイリアスの一覧を調べた記事

コマンドプロンプトの「ipconfig」の8文字と比較しても入力する文字数が少なく、出力結果も見やすいという良いことづくしな「PowerShellコマンドレットでIPアドレスを確認する方法」を紹介します。

新旧コマンドの比較

PowerShellコマンドレット「gip(Get-NetIPConfiguration)」

わたしが最近、意識的に使っている「gip(Get-NetIPConfiguration)」の結果は以下のとおり。

gip(Get-NetIPConfiguration) - テキストベース
gip(Get-NetIPConfiguration)
PowerShell 7.5.2
PS C:\Users\XXXX> gip

InterfaceAlias       : イーサネット
InterfaceIndex       : 11
InterfaceDescription : Realtek PCIe GbE Family Controller
NetProfile.Name      : ネットワーク 3
IPv4Address          : XXX.XXX.XXX.XXX
IPv4DefaultGateway   : XXX.XXX.XXX.XXX
DNSServer            : XXX.XXX.XXX.XXX
                       XXX.XXX.XXX.XXX

InterfaceAlias       : vEthernet (Default Switch)
InterfaceIndex       : 21
InterfaceDescription : Hyper-V Virtual Ethernet Adapter
IPv4Address          : XXX.XXX.XXX.XXX
IPv6DefaultGateway   :
IPv4DefaultGateway   :
DNSServer            : fec0:0:0:ffff::1
                       fec0:0:0:ffff::2
                       fec0:0:0:ffff::3

InterfaceAlias       : イーサネット 2
InterfaceIndex       : 33
InterfaceDescription : VirtualBox Host-Only Ethernet Adapter
IPv4Address          : XXX.XXX.XXX.XXX
IPv6DefaultGateway   :
IPv4DefaultGateway   :
DNSServer            : fec0:0:0:ffff::1
                       fec0:0:0:ffff::2
                       fec0:0:0:ffff::3

InterfaceAlias       : Bluetooth ネットワーク接続
InterfaceIndex       : 7
InterfaceDescription : Bluetooth Device (Personal Area Network)
NetAdapter.Status    : Disconnected

PS C:\Users\XXXX>

コマンドプロンプト「ipconfig」

みんな大好き「ipconfig」の結果は以下のとおり。

ipconfig - テキストベース
ipconfig
Microsoft Windows [Version 10.0.19045.6216]
(c) Microsoft Corporation. All rights reserved.

C:\Users\XXXX>ipconfig

Windows IP 構成


イーサネット アダプター vEthernet (Default Switch):

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::XXXX:XXXX:XXXX:XXXX%XX
   IPv4 アドレス . . . . . . . . . . . .: XXX.XXX.XXX.XXX
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .:

イーサネット アダプター イーサネット:

   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: XXX.XXX.XXX.XXX
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: XXX.XXX.XXX.XXX

イーサネット アダプター イーサネット 2:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::XXXX:XXXX:XXXX:XXXX%XX
   IPv4 アドレス . . . . . . . . . . . .: XXX.XXX.XXX.XXX
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .:

イーサネット アダプター Bluetooth ネットワーク接続:

   メディアの状態. . . . . . . . . . . .: メディアは接続されていません
   接続固有の DNS サフィックス . . . . .:

C:\Users\XXXX>

違いを比較

gipがオブジェクト形式となるため、取得したデータの加工や変換、フィルターなどが容易です。
実際に実行して比較してみましょう。

出力形式(違いを比較)

gip: オブジェクト形式

# gip は、オブジェクト形式で出力されているため、データ加工やフィルタが容易。
PS C:\Users\XXXX> $result = gip
PS C:\Users\XXXX>
PS C:\Users\XXXX> $result.GetType().FullName
System.Object[]
PS C:\Users\XXXX>
PS C:\Users\XXXX> $result[0] # 1つ目のネットワークインターフェイスの情報

InterfaceAlias       : イーサネット
InterfaceIndex       : 11
InterfaceDescription : Realtek PCIe GbE Family Controller
NetProfile.Name      : ネットワーク 3
IPv4Address          : XXX.XXX.XXX.XXX
IPv4DefaultGateway   : XXX.XXX.XXX.XXX
DNSServer            : XXX.XXX.XXX.XXX
                    XXX.XXX.XXX.XXX

PS C:\Users\XXXX>

ipconfig: テキスト形式

# ipconfig は、テキスト形式で出力されているため、単純に行ごとデータが入っていてデータ加工やフィルタを行う場合は複雑なデータ変換が必要。
PS C:\Users\XXXX> $result = ipconfig
PS C:\Users\XXXX>
PS C:\Users\XXXX> $result.GetType().FullName
System.Object[]
PS C:\Users\XXXX>
PS C:\Users\XXXX> $result[0] # コマンド結果の1行目の空行が表示

PS C:\Users\XXXX>
PS C:\Users\XXXX> $result[1] # コマンド結果の2行目のラベル行が表示
Windows IP 構成
PS C:\Users\XXXX>

データ加工・フィルター

gip: 豊富なプロパティ

PS C:\Users\XXXX> $result = gip
PS C:\Users\XXXX>
PS C:\Users\XXXX> $result | Get-Member -MemberType Property

TypeName: NetIPConfiguration

Name                 MemberType Definition
----                 ---------- ----------
AllIPAddresses       Property   ciminstance[] AllIPAddresses {get;set;}
CompartmentId        Property   int CompartmentId {get;set;}
ComputerName         Property   string ComputerName {get;set;}
Detailed             Property   bool Detailed {get;set;}
DNSServer            Property   ciminstance[] DNSServer {get;set;}
InterfaceAlias       Property   string InterfaceAlias {get;set;}
InterfaceDescription Property   string InterfaceDescription {get;set;}
InterfaceIndex       Property   int InterfaceIndex {get;set;}
IPv4Address          Property   ciminstance[] IPv4Address {get;set;}
IPv4DefaultGateway   Property   ciminstance[] IPv4DefaultGateway {get;set;}
IPv6Address          Property   ciminstance[] IPv6Address {get;set;}
IPv6DefaultGateway   Property   ciminstance[] IPv6DefaultGateway {get;set;}
IPv6LinkLocalAddress Property   ciminstance[] IPv6LinkLocalAddress {get;set;}
IPv6TemporaryAddress Property   ciminstance[] IPv6TemporaryAddress {get;set;}
NetAdapter           Property   ciminstance NetAdapter {get;set;}
NetCompartment       Property   ciminstance NetCompartment {get;set;}
NetIPv4Interface     Property   ciminstance NetIPv4Interface {get;set;}
NetIPv6Interface     Property   ciminstance NetIPv6Interface {get;set;}
NetProfile           Property   ciminstance NetProfile {get;set;}

PS C:\Users\XXXX>

ipconfig: 最小限のプロパティ

PS C:\Users\XXXX> $result = ipconfig
PS C:\Users\XXXX>
PS C:\Users\XXXX> $result | Get-Member -MemberType Property

TypeName: System.String

Name   MemberType Definition
----   ---------- ----------
Length Property   int Length {get;}

PS C:\Users\XXXX>

他のコマンドレットに連携

gip: 項目名を含めオブジェクトにあるデータが描画

PS C:\Users\XXXX> gip | Out-GridView

ipconfig: 単純にコマンド結果が行数ごとに描画

PS C:\Users\XXXX> ipconfig | Out-GridView

フィルターや加工が容易

フィルター:IPv4アドレスが設定されているネットワークインターフェイスを表示

PS C:\Users\XXXX> (gip).NetIPv4Interface

ifIndex InterfaceAlias                  AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp     ConnectionState PolicyStore
------- --------------                  ------------- ------------ --------------- ----     --------------- -----------
11      イーサネット                    IPv4                  1500              25 Disabled Connected       ActiveStore
21      vEthernet (Default Switch)      IPv4                  1500              15 Disabled Connected       ActiveStore
33      イーサネット 2                  IPv4                  1500              74 Disabled Connected       ActiveStore
7       Bluetooth ネットワーク接続      IPv4                  1500              65 Enabled  Disconnected    ActiveStore

PS C:\Users\XXXX>

加工:IPv4アドレスで特定の項目を表示

IPv4が有効なインターフェイスのみ表示し、必要な項目である「インターフェイス名 / IPアドレス(IPv4) / デフォルトゲートウェイ」の3つを表示するケース。

PS C:\Users\XXXX> gip | Where-Object { $_.IPv4Address } | Select-Object InterfaceAlias,
>>     @{ Name = 'IPAddress'; Expression = { $_.IPv4Address.IPAddress } },
>>     @{ Name = 'DefaultGateway'; Expression = { $_.IPv4DefaultGateway.NextHop } }

InterfaceAlias             IPAddress       DefaultGateway
--------------             ---------       --------------
イーサネット               XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX
vEthernet (Default Switch) XXX.XXX.XXX.XXX
イーサネット 2             XXX.XXX.XXX.XXX
Bluetooth ネットワーク接続 XXX.XXX.XXX.XXX

PS C:\Users\XXXX>

gipのメリット・デメリット

メリット

  • 表示が見やすい
    ラベル文字が緑色・整ったレイアウトのため、比較的に見やすい。

  • オブジェクト型で加工やフィルターが楽
    前述のとおり。

  • パイプラインや変数などで他の処理にも渡しやすい
    前述のとおり。

  • エイリアスであれば3文字で実行可能
    前述のとおり。

gipのデメリット

  • 覚えにくい
    ずっと「ipconfig(UNIXだとifconfig)」で覚えているため、新しいコマンドがすぐに出てこない。
    Get-NetIPConfigurationだと覚えるのに時間がかかるので、gipで覚える。

  • 低スペックのPCではもたつく可能性
    「コマンドプロンプト + ipconfig」の方が軽いので起動から表示までの時間を計測した場合に比較的はやい。
    → 表示した結果をより見やすくフィルターしたり、加工する場合は「PowerShell + gip」の方が良い。

  • 共有するコストがかかる可能性あり
    歴史があるため、ipconfigの方が一般的。エビデンスに残すなど不特定多数に共有する場合はipconfigの結果の方が好まれる可能性も。
    → 個人的には、コマンドプロンプトはいつか無くなるツールであり、そこまで気にする必要がないと思っているので、
      PowerShellを積極的に使っていきたいと考えている。

  • 確認しかできない
    PowerShellコマンドレットの設計思想は「"動詞"-"名詞"」です。
    gipGet-NetIPConfiguration は「IPの設定(NetIPConfiguration取得して表示(Get」のコマンド。
    つまりは、gip取得のみ行うコマンドレットとなり、その他の機能は実装されていません。

    ipconfig の機能 目的 PowerShellでの代替コマンド
    ipconfig or ipconfig /all IP構成情報の表示 gip
    (フル: Get-NetIPConfiguration
    ipconfig /release IPアドレスの解放 Restart-NetAdapter
    (解放のみは不可。解放と再取得を同時に行う)
    ipconfig /renew IPアドレスの再取得 Restart-NetAdapter
    ipconfig /flushdns DNSキャッシュのクリア Clear-DnsClientCache

    → 個人的にはPowerShellコマンドレットの方を積極的に取り入れていこうと思います。

まとめ

ここまで調査した結果からも、IPアドレスの確認を目的とするならば、「gipGet-NetIPConfiguration)」の方がモダンでよさそう。

ただ、不特定多数に共有する場合や、確認以外を目的とする場合は、まだまだipconfigの出番はありそうですね。

ちなみにPowerShellには、gipGet-NetIPConfiguration)の他にGet-NetIPAddressというコマンドレットでもIPアドレスを確認できます。
Get-NetIPAddressにはエイリアスがなく覚えにくいので本記事では紹介していませんが、IPアドレスの情報に特化したコマンドレットで、状況によっては使い分けた方が便利かもしれません。

参考文献

https://learn.microsoft.com/en-us/powershell/module/nettcpip/get-netipconfiguration

https://learn.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress

https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/ipconfig

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960
https://zenn.dev/haretokidoki/articles/fb6830f9155de5

GitHubで編集を提案

Discussion