Powershell将ipv4地址转换为变量

时间:2014-12-03 17:14:38

标签: windows powershell-v3.0

在PowerShell 3.0 Windows 7中有一种简单的方法可以将本地计算机的ipv4地址变为变量吗?

15 个答案:

答案 0 :(得分:27)

这是另一种解决方案:

$env:HostIP = (
    Get-NetIPConfiguration |
    Where-Object {
        $_.IPv4DefaultGateway -ne $null -and
        $_.NetAdapter.Status -ne "Disconnected"
    }
).IPv4Address.IPAddress

答案 1 :(得分:23)

这个怎么样? (不是我的真实IP地址!)

PS C:\> $ipV4 = Test-Connection -ComputerName (hostname) -Count 1  | Select IPV4Address

PS C:\> $ipV4

IPV4Address                                                  
-----------
192.0.2.0

请注意,使用localhost只会返回并且IP为127.0.0.1

PS C:\> $ipV4 = Test-Connection -ComputerName localhost -Count 1  | Select IPV4Address

PS C:\> $ipV4

IPV4Address                                                             
-----------                                                  
127.0.0.1

必须扩展IP地址对象以获取地址字符串

PS C:\> $ipV4 = Test-Connection -ComputerName (hostname) -Count 1  | Select -ExpandProperty IPV4Address 

PS C:\> $ipV4

Address            : 556228818
AddressFamily      : InterNetwork
ScopeId            : 
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 192.0.2.0


PS C:\> $ipV4.IPAddressToString
192.0.2.0

答案 2 :(得分:9)

如果我使用机器名称,这是有效的。但有点像黑客(因为我只是选择了我获得的ipv4地址的第一个值。)

$ipaddress=([System.Net.DNS]::GetHostAddresses('PasteMachineNameHere')|Where-Object {$_.AddressFamily -eq "InterNetwork"}   |  select-object IPAddressToString)[0].IPAddressToString

请注意,您必须在上面的表达式中替换值 PasteMachineNameHere

这也有效

$localIpAddress=((ipconfig | findstr [0-9].\.)[0]).Split()[-1]

答案 3 :(得分:6)

(Get-WmiObject -Class Win32_NetworkAdapterConfiguration | where {$_.DefaultIPGateway -ne $null}).IPAddress | select-object -first 1

答案 4 :(得分:6)

以下是三种使用 windows powershell 和/或 powershell core 的方法,从最快到最慢列出。 您可以将其分配给您选择的变量。



方法1:(此方法是最快的方法,并且在Windows PowerShell和PowerShell Core中均有效)
$ipAddress = (Get-NetIPAddress | Where-Object {$_.AddressState -eq "Preferred" -and $_.ValidLifetime -lt "24:00:00"}).IPAddress


方法2 :(此方法与方法1一样快,但不适用于Powershell内核)
$ipAddress = (Test-Connection -ComputerName (hostname) -Count 1 | Select -ExpandProperty IPv4Address).IPAddressToString


方法3:(尽管最慢,但它同时适用于Windows Powershell和PowerShell核心)
$ipAddress = (Get-NetIPConfiguration | Where-Object {$_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.status -ne "Disconnected"}).IPv4Address.IPAddress

答案 5 :(得分:5)

以下是我最终使用

的内容
In [77]: df.loc[(df.buy==0) & (df.buy.shift(-1)==1)]
Out[77]:
        id                date  sec  buy
1  5211153 2016-06-13 18:50:54   66    0
6  5211154 2016-06-13 18:59:59   11    0

分解
  • 执行ipconfig命令 - 获取所有网络接口信息
  • 使用powershell' s过滤正则表达式
  • 正则表达式找到" IPv4"和一组4个块,每个块具有由句点分隔的1-3个数字,即v4 IP地址
  • 通过将输出管道为空来忽略输出
  • 最后得到正则表达式括号中定义的第一个匹配组。
  • 在$ ipaddress中捕获该输出以供以后使用。

答案 6 :(得分:3)

另一个使用$env环境变量来获取主机名的变体:

Test-Connection -ComputerName $env:computername -count 1 | Select-Object IPV4Address

或者您只想要返回没有属性标题的IP地址

(Test-Connection -ComputerName $env:computername -count 1).IPV4Address.ipaddressTOstring

答案 7 :(得分:1)

这根衬里为您提供IP地址:

(Test-Connection -ComputerName $env:computername -count 1).ipv4address.IPAddressToString

将其包含在变量中吗?

$IPV4=(Test-Connection -ComputerName $env:computername -count 1).ipv4address.IPAddressToString

答案 8 :(得分:1)

我一直在寻找同样的东西并发现了这一点:

$ip = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $(Get-NetConnectionProfile | Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress

这会过滤掉环回地址和我拥有的一些虚拟网络。

答案 9 :(得分:0)

tldr;

我使用此命令将以太网适配器的IP地址获取到名为IP的变量中。

for /f "tokens=3 delims=: " %i  in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i

对于那些想知道所有含义的人,请继续阅读

例如,大多数使用ipconfig的命令只会打印出您的所有IP地址,而我需要一个特定的地址,在我的情况下,该地址用于我的以太网适配器。

您可以使用netsh interface ipv4 show interfaces命令查看网络适配器列表。大多数人需要Wi-Fi或以太网。

在命令提示符的输出中,您将看到一个类似这样的表:

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 15          25        1500  connected     Ethernet
 17        5000        1500  connected     vEthernet (Default Switch)
 32          15        1500  connected     vEthernet (DockerNAT)

在名称列中,您应该找到所需的网络适配器(即以太网,Wi-Fi等)。

如前所述,我对Ethernet感兴趣。

要获取该适配器的IP,我们可以使用netsh命令:

netsh interface ip show config name="Ethernet"

这给了我们这个输出:

Configuration for interface "Ethernet"
    DHCP enabled:                         Yes
    IP Address:                           169.252.27.59
    Subnet Prefix:                        169.252.0.0/16 (mask 255.255.0.0)
    InterfaceMetric:                      25
    DNS servers configured through DHCP:  None
    Register with which suffix:           Primary only
    WINS servers configured through DHCP: None

(出于安全原因?,我伪造了上述实际IP地址)

我可以在ms-dos命令提示符下使用findstr命令进一步指定要在哪一行。 在这里,我需要包含字符串IP Address的行。

netsh interface ip show config name="Ethernet" | findstr "IP Address"

这将提供以下输出:

 IP Address:                           169.252.27.59

然后,我可以使用for命令,该命令使我可以分析文件(在这种情况下为多行字符串),并根据分隔符和我感兴趣的项目编号来拆分字符串的内容。

请注意,我正在寻找第三个项目(令牌= 3),并且我使用空格字符和:作为分隔符(delims=:)。

for /f "tokens=3 delims=: " %i  in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i

循环中的每个值或令牌都作为变量%i打印出来,但是我只对第三个“令牌”或项感兴趣(因此tokens=3)。请注意,我必须使用|

转义=^

for命令的末尾,您可以指定要与返回的内容一起运行的命令。在这种情况下,我使用set将值分配给名为IP的环境变量。如果您愿意,也可以只回显该值或您喜欢的任何内容。

这样,您将获得一个环境变量,并将您的首选网络适配器的IP地址分配给一个环境变量。很好,是吧?

如果您有任何改进的想法,请发表评论。

答案 10 :(得分:0)

# Patrick Burwell's Ping Script - Patrick.Burwell@Infosys.com #
$Output= @() #sets an array
$names = Get-Content ".\input\ptd.pc_list.txt" #sets a list to use, like a DNS dump
foreach ($name in $names){ #sets the input by enumerating a text file to loop through and sets a variable to execute against 
  if ($IPV4 = Test-Connection -Delay 15 -ComputerName $name -Count 1 -ErrorAction SilentlyContinue|select IPV4Address #run ping and sets only IPV4Address response variable
  ){# If true then run...
   $Output+= $Name,($IPV4.IPV4Address).IPAddressToString # Fills the array with the #true response
   Write-Host $Name',','Ping,'($IPV4.IPV4Address).IPAddressToString -ForegroundColor Green #Sets the output to receive the Name, result and IPV4Address and prints the reply to the console with specific colors
  }
  else{#If false then run...
    $Output+= "$name," #Fills the array with the #false response
    Write-Host "$Name," -ForegroundColor Red #Prints the reply to the console with specific colors 
  }
}

#$Output | Out-file ".\output\result.csv" #<-- use to export to a text file (Set path as needed)
#$Output | Export-CSV ".\output\result.csv" -NoTypeInformation #<-- use to export to a csv file (Set path as needed)

#If you choose, you can merely have the reply by the name and IP, and the Name and no IP by removing the Ping comments

答案 11 :(得分:0)

当我在 Powershell 3 中工作时,这里的所有答案都不适合我。它基于 Rob 的方法,但是当您有多个网络适配器时,此方法有效,它还可以使用捕获组正确选择 IP

function GetIPConfig {      
    return ipconfig | select-string  ('(\s)+IPv4.+\s(?<IP>(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(\s)*') -AllMatches | %{ $_.Matches } | % { $_.Groups["IP"]} | %{ $_.Value }
}

答案 12 :(得分:-1)

我最近遇到了同样的问题。所以我写了一个脚本来从ipconfig /all输出中解析它。此脚本可以轻松修改以获取接口的任何参数,并且它也可以在Windows 7上运行。

  1. LineNumber | Line格式
  2. 获取IP配置的输出

    $ip_config = $(ipconfig /all | % {$_ -split "环R n"} | Select-String -Pattern ".*" | select LineNumber, Line)

    1. ipconfig格式获取接口列表(+ LineNumber | Line输出的最后一行)
    2. $interfaces = $($ip_config | where {$_.Line -notmatch '^\s*$'} | where {$_.Line -notmatch '^\s'}) + $($ip_config | Select -last 1)

      1. 通过接口列表筛选所需的特定接口
      2. $LAN = $($interfaces | where {$_.Line -match 'Wireless Network Connection:$'})

        1. 从输出中获取所选接口的起始和结束行号
        2. $i = $interfaces.IndexOf($LAN)
          $start = $LAN.LineNumber
          $end = $interfaces[$i+1].LineNumber

          1. start..end
          2. 中选择一行

            $LAN = $ip_config | where {$_.LineNumber -in ($start..$end)}

            1. 获取IP(v4)地址字段(如果不存在IPv4地址,则返回null)
            2. $LAN_IP = @($LAN | where {$_ -match 'IPv4.+:\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'})
              $LAN_IP = &{If ($LAN_IP.Count -gt 0) {$Matches[1]} Else {$null}}

答案 13 :(得分:-1)

$a = ipconfig
$result = $a[8] -replace "IPv4 Address. . . . . . . . . . . :",""

还要检查ipconfig的哪个索引具有IPv4地址

答案 14 :(得分:-1)

要获取设备的IPv4地址,并进行过滤以仅获取与您的方案匹配的地址(即,忽略和APIPA地址或LocalHost地址)。例如,您可以说要获取匹配192.168.200.*的地址。

$IPv4Addr = Get-NetIPAddress -AddressFamily ipV4 | where {$_.IPAddress -like X.X.X.X} | Select IPAddress