使用“1”参数调用“GetHostEntry”的异常:“没有这样的设备或地址”

时间:2018-02-16 06:25:26

标签: linux powershell scripting system-administration fqdn

此机器的FQDN

thufir@dur:~$ 
thufir@dur:~$ hostname --fqdn
dur.bounceme.net
thufir@dur:~$ 

是的......与powershell一起工作directly可以FQDN dur.bounceme.net好了:

thufir@dur:~/powershell$ 
thufir@dur:~/powershell$ pwsh
PowerShell v6.0.1
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/pscore6-docs
Type 'help' to get help.

PS /home/thufir/powershell> 
PS /home/thufir/powershell> [System.Net.Dns]::GetHostByName((hostname)).HostName                                        
dur.bounceme.net
PS /home/thufir/powershell> 

但如果我想迭代一个数组怎么办?如何让FQDN显示为dur.bounceme.net

thufir@dur:~/powershell$ 
thufir@dur:~/powershell$ ./hostname.ps1 
dur.bounceme.net
beginning loop
google.com
Exception calling "GetHostEntry" with "1" argument(s): "No such device or address"
At /home/thufir/powershell/hostname.ps1:14 char:3
+   $fqdn = [System.Net.Dns]::GetHostEntry($i).HostName
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ExtendedSocketException

google.com
localhost
end
thufir@dur:~/powershell$ 

脚本:

#!/usr/bin/pwsh -Command


#hostname is a reserved variable name?

[System.Net.Dns]::GetHostByName((hostname)).HostName


"beginning loop"

$hosts = ("google.com", "hostname", "localhost")

foreach($i in $hosts) {
  $fqdn = [System.Net.Dns]::GetHostEntry($i).HostName
  write-host $fqdn
}


"end"

我尝试从hostname左右删除引号,并在美元符号$前加上。这是一个保留字?

用于解释所涉及术语的奖励点。

2 个答案:

答案 0 :(得分:1)

您正在使用主机名作为字符串,并且该字符串不在您的hosts文件中,就像localhost一样,它将失败。

如果您使用的是默认的本地主机名,则它们是:

'127.0.0.1'
$env:COMPUTERNAME
'localhost'

所以,你应该这样做

$TargetHosts = ('stackoverflow.com','google.com', $env:COMPUTERNAME,'localhost','127.0.0.1')

foreach($TargetHost in $TargetHosts) 
{ ( $fqdn = [Net.Dns]::GetHostEntry($TargetHost).Hostname ) }

stackoverflow.com
google.com
WS01
WS01
WS01

另请参阅此文章,了解如何使用本机Resolve-DnsName cmdlet与.NET库。

  

为什么不使用内置的DNS cmdlet?还是有一个特别的   你是否正沿着原始的.Net路径旅行?代码项目,   家庭作业,好奇心?

     

here

答案 1 :(得分:1)

似乎存在关于 hostname 的作用以及命令和字符串之间的区别的混淆。让我们看看第一部分是否有效:

[System.Net.Dns]::GetHostByName((hostname)).HostName

Powershell将其解析为

Run command hostname, 
Call GetHostByName(), pass hostname's output as a parameter to the call
from that result, show the HostName attribute

在foreach循环中,参数作为字符串传递。因此,在主机名案例中:

$i <-- hostname
[System.Net.Dns]::GetHostEntry($i).HostName

正在被解析为

Call GetHostEntry("hostname")
from that result, show the HostName attribute